From 4b8dbfd9c5d82019d9b64bfc6616b553edfc13be Mon Sep 17 00:00:00 2001 From: Yao Liu Date: Wed, 22 Jan 2025 11:32:35 -0800 Subject: [PATCH] init --- AgentOccam/AgentOccam.py | 1448 + AgentOccam/__init__.py | 2 + AgentOccam/configs/AgentOccam-Judge.yml | 78 + AgentOccam/configs/AgentOccam-SteP.yml | 26 + AgentOccam/configs/AgentOccam-WebVoyager.yml | 74 + AgentOccam/configs/AgentOccam.yml | 78 + AgentOccam/configs/SteP-replication.yml | 26 + ...ced_action-X_scrolling-obs_opt-history.yml | 78 + .../reduced_action-X_scrolling-obs_opt.yml | 78 + .../configs/reduced_action-X_scrolling.yml | 78 + AgentOccam/configs/reduced_action.yml | 78 + AgentOccam/env.py | 129 + AgentOccam/llms/claude.py | 213 + AgentOccam/llms/cohere.py | 42 + AgentOccam/llms/gemini.py | 107 + AgentOccam/llms/gpt.py | 222 + AgentOccam/llms/llama.py | 41 + AgentOccam/llms/mistral.py | 42 + AgentOccam/llms/titan.py | 44 + AgentOccam/obs_opt.py | 410 + AgentOccam/plot.py | 291 + AgentOccam/prompts/AgentOccam_prompt.py | 92 + .../navigation_specifications/click.txt | 1 + .../navigation_specifications/go_back.txt | 1 + .../navigation_specifications/go_home.txt | 1 + .../navigation_specifications/note.txt | 1 + .../navigation_specifications/scroll.txt | 1 + .../navigation_specifications/stop.txt | 1 + .../navigation_specifications/type.txt | 1 + .../prompts/output_specifications/action.txt | 1 + .../action_assessment.txt | 1 + .../action_candidates.txt | 1 + .../action_selection.txt | 1 + .../interaction_history_summary.txt | 1 + .../output_specifications/mistakes.txt | 26 + .../observation_description.txt | 1 + .../observation_highlight.txt | 1 + .../plan_progress_assessment.txt | 1 + .../prompts/output_specifications/reason.txt | 1 + .../planning_specifications/branch.txt | 1 + .../prompts/planning_specifications/prune.txt | 1 + AgentOccam/utils.py | 401 + Agent_E/ae/config.py | 26 + Agent_E/ae/core/__init__.py | 9 + Agent_E/ae/core/agents/__init__.py | 1 + Agent_E/ae/core/agents/browser_nav_agent.py | 164 + .../core/agents/high_level_planner_agent.py | 77 + Agent_E/ae/core/agents_llm_config.py | 197 + Agent_E/ae/core/autogen_wrapper.py | 384 + Agent_E/ae/core/memory/static_ltm.py | 22 + Agent_E/ae/core/notification_manager.py | 53 + Agent_E/ae/core/playwright_manager.py | 452 + Agent_E/ae/core/post_process_responses.py | 43 + Agent_E/ae/core/prompts.py | 185 + Agent_E/ae/core/skills/__init__.py | 18 + .../ae/core/skills/click_using_selector.py | 217 + .../ae/core/skills/enter_text_and_click.py | 82 + .../core/skills/enter_text_using_selector.py | 263 + .../core/skills/get_dom_with_content_type.py | 115 + Agent_E/ae/core/skills/get_url.py | 40 + Agent_E/ae/core/skills/get_user_input.py | 26 + Agent_E/ae/core/skills/open_url.py | 70 + Agent_E/ae/core/skills/pdf_text_extractor.py | 88 + .../ae/core/skills/press_key_combination.py | 111 + Agent_E/ae/core/skills/skill_registry.py | 29 + Agent_E/ae/core/system_orchestrator.py | 227 + Agent_E/ae/core/ui_manager.py | 221 + Agent_E/ae/server/__init__.py | 0 Agent_E/ae/server/api_routes.py | 191 + Agent_E/ae/ui/injectOverlay.js | 801 + .../ae/user_preferences/user_preferences.txt | 11 + Agent_E/ae/utils/__init__.py | 0 Agent_E/ae/utils/anthropic_llm_helper.py | 52 + .../utils/autogen_sequential_function_call.py | 85 + Agent_E/ae/utils/cli_helper.py | 34 + Agent_E/ae/utils/detect_llm_loops.py | 46 + Agent_E/ae/utils/dom_helper.py | 45 + Agent_E/ae/utils/dom_mutation_observer.py | 88 + Agent_E/ae/utils/formatting_helper.py | 56 + Agent_E/ae/utils/gemini_llm_helper.py | 77 + .../utils/get_detailed_accessibility_tree.py | 529 + Agent_E/ae/utils/http_helper.py | 43 + Agent_E/ae/utils/js_helper.py | 34 + Agent_E/ae/utils/logger.py | 71 + Agent_E/ae/utils/openai_llm_helper.py | 51 + Agent_E/ae/utils/response_parser.py | 60 + Agent_E/ae/utils/ui_messagetype.py | 14 + Agent_E/test/evaluators.py | 437 + Agent_E/test/test_utils.py | 263 + Agent_E/test/tests_processor.py | 409 + README.md | 228 +- agente_replication.py | 29 + browser_env/__init__.py | 78 + browser_env/actions.py | 1948 + browser_env/async_envs.py | 153 + browser_env/auto_login.py | 207 + browser_env/constants.py | 295 + browser_env/env_config.py | 51 + browser_env/envs.py | 334 + browser_env/helper_functions.py | 307 + browser_env/html_tools/__init__.py | 6 + browser_env/html_tools/configs/__init__.py | 3 + browser_env/html_tools/configs/config.py | 49 + browser_env/html_tools/configs/html_prompt.py | 22 + browser_env/html_tools/html_parser.py | 426 + browser_env/html_tools/identifier.py | 64 + browser_env/html_tools/prompt.py | 97 + browser_env/html_tools/utils.py | 101 + browser_env/processors.py | 1125 + browser_env/py.typed | 0 browser_env/scripts/__init__.py | 43 + browser_env/scripts/canva_handler.js | 44 + browser_env/scripts/get_data.js | 73 + browser_env/scripts/get_text.js | 48 + browser_env/scripts/label_marker.js | 65 + browser_env/scripts/local_marker.js | 46 + browser_env/scripts/mix_marker.js | 148 + browser_env/trajectory.py | 6 + browser_env/utils.py | 80 + config_files/tasks/stanford_cs_head.json | 20 + config_files/tasks/tsinghua_da_head.json | 20 + config_files/test.raw.json | 29623 ++++++++++++++++ config_files/webvoyager/Allrecipes--10.json | 20 + config_files/webvoyager/Allrecipes--17.json | 20 + config_files/webvoyager/Allrecipes--3.json | 20 + config_files/webvoyager/Allrecipes--40.json | 20 + config_files/webvoyager/Amazon--16.json | 20 + config_files/webvoyager/Apple--12.json | 20 + config_files/webvoyager/Apple--17.json | 20 + config_files/webvoyager/Apple--18.json | 20 + config_files/webvoyager/Apple--19.json | 20 + config_files/webvoyager/Apple--28.json | 20 + config_files/webvoyager/Apple--31.json | 20 + config_files/webvoyager/Apple--37.json | 20 + config_files/webvoyager/ArXiv--10.json | 20 + config_files/webvoyager/ArXiv--11.json | 20 + config_files/webvoyager/ArXiv--12.json | 20 + config_files/webvoyager/ArXiv--14.json | 20 + config_files/webvoyager/ArXiv--17.json | 20 + config_files/webvoyager/ArXiv--18.json | 20 + config_files/webvoyager/ArXiv--25.json | 20 + config_files/webvoyager/ArXiv--27.json | 20 + config_files/webvoyager/ArXiv--30.json | 20 + config_files/webvoyager/ArXiv--31.json | 20 + config_files/webvoyager/ArXiv--36.json | 20 + config_files/webvoyager/ArXiv--37.json | 20 + config_files/webvoyager/ArXiv--39.json | 20 + config_files/webvoyager/ArXiv--41.json | 20 + config_files/webvoyager/ArXiv--42.json | 20 + config_files/webvoyager/ArXiv--6.json | 20 + config_files/webvoyager/BBC News--28.json | 20 + config_files/webvoyager/BBC News--5.json | 20 + config_files/webvoyager/Booking--33.json | 20 + config_files/webvoyager/Booking--41.json | 20 + .../webvoyager/Cambridge Dictionary--0.json | 20 + .../webvoyager/Cambridge Dictionary--17.json | 20 + .../webvoyager/Cambridge Dictionary--18.json | 20 + .../webvoyager/Cambridge Dictionary--19.json | 20 + .../webvoyager/Cambridge Dictionary--21.json | 20 + .../webvoyager/Cambridge Dictionary--26.json | 20 + .../webvoyager/Cambridge Dictionary--28.json | 20 + .../webvoyager/Cambridge Dictionary--42.json | 20 + .../webvoyager/Cambridge Dictionary--6.json | 20 + config_files/webvoyager/Coursera--38.json | 20 + config_files/webvoyager/Coursera--39.json | 20 + config_files/webvoyager/ESPN--11.json | 20 + config_files/webvoyager/ESPN--15.json | 20 + config_files/webvoyager/ESPN--17.json | 20 + config_files/webvoyager/ESPN--18.json | 20 + config_files/webvoyager/ESPN--19.json | 20 + config_files/webvoyager/ESPN--27.json | 20 + config_files/webvoyager/ESPN--28.json | 20 + config_files/webvoyager/ESPN--31.json | 20 + config_files/webvoyager/ESPN--41.json | 20 + config_files/webvoyager/ESPN--9.json | 20 + config_files/webvoyager/Google Map--1.json | 20 + config_files/webvoyager/Google Map--21.json | 20 + config_files/webvoyager/Google Map--26.json | 20 + config_files/webvoyager/Google Map--28.json | 20 + config_files/webvoyager/Google Map--31.json | 20 + config_files/webvoyager/Google Map--33.json | 20 + config_files/webvoyager/Google Map--7.json | 20 + config_files/webvoyager/Google Map--8.json | 20 + config_files/webvoyager/Google Map--9.json | 20 + config_files/webvoyager/Google Search--0.json | 20 + .../webvoyager/Google Search--12.json | 20 + .../webvoyager/Google Search--14.json | 20 + .../webvoyager/Google Search--15.json | 20 + .../webvoyager/Google Search--17.json | 20 + .../webvoyager/Google Search--18.json | 20 + .../webvoyager/Google Search--19.json | 20 + .../webvoyager/Google Search--20.json | 20 + .../webvoyager/Google Search--21.json | 20 + .../webvoyager/Google Search--24.json | 20 + .../webvoyager/Google Search--28.json | 20 + .../webvoyager/Google Search--29.json | 20 + config_files/webvoyager/Google Search--3.json | 20 + .../webvoyager/Google Search--31.json | 20 + .../webvoyager/Google Search--40.json | 20 + config_files/webvoyager/Google Search--7.json | 20 + config_files/webvoyager/Huggingface--10.json | 20 + config_files/webvoyager/Huggingface--13.json | 20 + config_files/webvoyager/Huggingface--14.json | 20 + config_files/webvoyager/Huggingface--18.json | 20 + config_files/webvoyager/Huggingface--20.json | 20 + config_files/webvoyager/Huggingface--21.json | 20 + config_files/webvoyager/Huggingface--24.json | 20 + config_files/webvoyager/Huggingface--25.json | 20 + config_files/webvoyager/Huggingface--27.json | 20 + config_files/webvoyager/Huggingface--30.json | 20 + config_files/webvoyager/Huggingface--32.json | 20 + config_files/webvoyager/Huggingface--38.json | 20 + config_files/webvoyager/Huggingface--41.json | 20 + config_files/webvoyager/Huggingface--42.json | 20 + config_files/webvoyager/Huggingface--6.json | 20 + config_files/webvoyager/Huggingface--7.json | 20 + config_files/webvoyager/Huggingface--9.json | 20 + config_files/webvoyager/Wolfram Alpha--0.json | 20 + .../webvoyager/Wolfram Alpha--10.json | 20 + .../webvoyager/Wolfram Alpha--11.json | 20 + .../webvoyager/Wolfram Alpha--12.json | 20 + .../webvoyager/Wolfram Alpha--15.json | 20 + .../webvoyager/Wolfram Alpha--17.json | 20 + config_files/webvoyager/Wolfram Alpha--2.json | 20 + .../webvoyager/Wolfram Alpha--20.json | 20 + .../webvoyager/Wolfram Alpha--21.json | 20 + .../webvoyager/Wolfram Alpha--22.json | 20 + .../webvoyager/Wolfram Alpha--23.json | 20 + .../webvoyager/Wolfram Alpha--24.json | 20 + .../webvoyager/Wolfram Alpha--25.json | 20 + .../webvoyager/Wolfram Alpha--27.json | 20 + .../webvoyager/Wolfram Alpha--28.json | 20 + config_files/webvoyager/Wolfram Alpha--3.json | 20 + .../webvoyager/Wolfram Alpha--32.json | 20 + .../webvoyager/Wolfram Alpha--33.json | 20 + .../webvoyager/Wolfram Alpha--34.json | 20 + .../webvoyager/Wolfram Alpha--35.json | 20 + .../webvoyager/Wolfram Alpha--36.json | 20 + .../webvoyager/Wolfram Alpha--37.json | 20 + .../webvoyager/Wolfram Alpha--38.json | 20 + .../webvoyager/Wolfram Alpha--39.json | 20 + config_files/webvoyager/Wolfram Alpha--4.json | 20 + .../webvoyager/Wolfram Alpha--40.json | 20 + .../webvoyager/Wolfram Alpha--41.json | 20 + .../webvoyager/Wolfram Alpha--42.json | 20 + .../webvoyager/Wolfram Alpha--43.json | 20 + .../webvoyager/Wolfram Alpha--45.json | 20 + config_files/webvoyager/Wolfram Alpha--5.json | 20 + config_files/webvoyager/Wolfram Alpha--6.json | 20 + config_files/webvoyager/Wolfram Alpha--7.json | 20 + config_files/webvoyager/Wolfram Alpha--9.json | 20 + eval_webarena.py | 141 + evaluation_harness/__init__.py | 6 + evaluation_harness/evaluators.py | 419 + evaluation_harness/helper_functions.py | 220 + files/overview.png | Bin 0 -> 2111599 bytes llms/__init__.py | 16 + llms/lm_config.py | 61 + llms/providers/anthropic_utils.py | 45 + llms/providers/hf_utils.py | 21 + llms/providers/openai_utils.py | 283 + llms/tokenizers.py | 29 + llms/utils.py | 67 + requirements.txt | 11 + scripts/run_config.sh | 11 + scripts/run_webarena.sh | 6 + webagents_step/__init__.py | 0 webagents_step/agents/agent.py | 106 + webagents_step/agents/prompt_agent.py | 59 + webagents_step/agents/step_agent.py | 105 + webagents_step/environment/env.py | 18 + webagents_step/environment/liveweb.py | 175 + .../parser/playwright_parser_webarena.py | 99 + .../prompts/webarena/step_fewshot_template.py | 1457 + .../webarena/step_fewshot_template_adapted.py | 1396 + webagents_step/utils/data_prep.py | 137 + webagents_step/utils/llm.py | 422 + webagents_step/utils/stack.py | 22 + webarena/agent/__init__.py | 8 + webarena/agent/agent.py | 227 + webarena/agent/prompts/__init__.py | 1 + .../prompts/jsons/new_action_prompt.json | 21 + .../prompts/jsons/p_cot_id_actree_2s.json | 27 + .../jsons/p_cot_id_actree_2s_no_na.json | 27 + .../prompts/jsons/p_direct_id_actree_2s.json | 26 + .../jsons/p_direct_id_actree_2s_no_na.json | 27 + .../jsons/p_direct_id_actree_3s_llama.json | 32 + webarena/agent/prompts/jsons/test_prompt.json | 20 + webarena/agent/prompts/prompt_constructor.py | 683 + .../agent/prompts/raw/new_action_prompt.py | 118 + .../agent/prompts/raw/p_cot_id_actree_2s.py | 82 + .../prompts/raw/p_cot_id_actree_2s_no_na.py | 82 + .../prompts/raw/p_direct_id_actree_2s.py | 80 + .../raw/p_direct_id_actree_2s_no_na.py | 81 + .../raw/p_direct_id_actree_3s_llama.py | 83 + webarena/agent/prompts/raw/test_prompt.py | 41 + webarena/agent/prompts/to_json.py | 26 + webarena_replication.py | 464 + 298 files changed, 56437 insertions(+), 9 deletions(-) create mode 100644 AgentOccam/AgentOccam.py create mode 100644 AgentOccam/__init__.py create mode 100644 AgentOccam/configs/AgentOccam-Judge.yml create mode 100644 AgentOccam/configs/AgentOccam-SteP.yml create mode 100644 AgentOccam/configs/AgentOccam-WebVoyager.yml create mode 100644 AgentOccam/configs/AgentOccam.yml create mode 100644 AgentOccam/configs/SteP-replication.yml create mode 100644 AgentOccam/configs/reduced_action-X_scrolling-obs_opt-history.yml create mode 100644 AgentOccam/configs/reduced_action-X_scrolling-obs_opt.yml create mode 100644 AgentOccam/configs/reduced_action-X_scrolling.yml create mode 100644 AgentOccam/configs/reduced_action.yml create mode 100644 AgentOccam/env.py create mode 100644 AgentOccam/llms/claude.py create mode 100644 AgentOccam/llms/cohere.py create mode 100644 AgentOccam/llms/gemini.py create mode 100644 AgentOccam/llms/gpt.py create mode 100644 AgentOccam/llms/llama.py create mode 100644 AgentOccam/llms/mistral.py create mode 100644 AgentOccam/llms/titan.py create mode 100644 AgentOccam/obs_opt.py create mode 100644 AgentOccam/plot.py create mode 100644 AgentOccam/prompts/AgentOccam_prompt.py create mode 100644 AgentOccam/prompts/navigation_specifications/click.txt create mode 100644 AgentOccam/prompts/navigation_specifications/go_back.txt create mode 100644 AgentOccam/prompts/navigation_specifications/go_home.txt create mode 100644 AgentOccam/prompts/navigation_specifications/note.txt create mode 100644 AgentOccam/prompts/navigation_specifications/scroll.txt create mode 100644 AgentOccam/prompts/navigation_specifications/stop.txt create mode 100644 AgentOccam/prompts/navigation_specifications/type.txt create mode 100644 AgentOccam/prompts/output_specifications/action.txt create mode 100644 AgentOccam/prompts/output_specifications/action_assessment.txt create mode 100644 AgentOccam/prompts/output_specifications/action_candidates.txt create mode 100644 AgentOccam/prompts/output_specifications/action_selection.txt create mode 100644 AgentOccam/prompts/output_specifications/interaction_history_summary.txt create mode 100644 AgentOccam/prompts/output_specifications/mistakes.txt create mode 100644 AgentOccam/prompts/output_specifications/observation_description.txt create mode 100644 AgentOccam/prompts/output_specifications/observation_highlight.txt create mode 100644 AgentOccam/prompts/output_specifications/plan_progress_assessment.txt create mode 100644 AgentOccam/prompts/output_specifications/reason.txt create mode 100644 AgentOccam/prompts/planning_specifications/branch.txt create mode 100644 AgentOccam/prompts/planning_specifications/prune.txt create mode 100644 AgentOccam/utils.py create mode 100644 Agent_E/ae/config.py create mode 100644 Agent_E/ae/core/__init__.py create mode 100644 Agent_E/ae/core/agents/__init__.py create mode 100644 Agent_E/ae/core/agents/browser_nav_agent.py create mode 100644 Agent_E/ae/core/agents/high_level_planner_agent.py create mode 100644 Agent_E/ae/core/agents_llm_config.py create mode 100644 Agent_E/ae/core/autogen_wrapper.py create mode 100644 Agent_E/ae/core/memory/static_ltm.py create mode 100644 Agent_E/ae/core/notification_manager.py create mode 100644 Agent_E/ae/core/playwright_manager.py create mode 100644 Agent_E/ae/core/post_process_responses.py create mode 100644 Agent_E/ae/core/prompts.py create mode 100644 Agent_E/ae/core/skills/__init__.py create mode 100644 Agent_E/ae/core/skills/click_using_selector.py create mode 100644 Agent_E/ae/core/skills/enter_text_and_click.py create mode 100644 Agent_E/ae/core/skills/enter_text_using_selector.py create mode 100644 Agent_E/ae/core/skills/get_dom_with_content_type.py create mode 100644 Agent_E/ae/core/skills/get_url.py create mode 100644 Agent_E/ae/core/skills/get_user_input.py create mode 100644 Agent_E/ae/core/skills/open_url.py create mode 100644 Agent_E/ae/core/skills/pdf_text_extractor.py create mode 100644 Agent_E/ae/core/skills/press_key_combination.py create mode 100644 Agent_E/ae/core/skills/skill_registry.py create mode 100644 Agent_E/ae/core/system_orchestrator.py create mode 100644 Agent_E/ae/core/ui_manager.py create mode 100644 Agent_E/ae/server/__init__.py create mode 100644 Agent_E/ae/server/api_routes.py create mode 100644 Agent_E/ae/ui/injectOverlay.js create mode 100644 Agent_E/ae/user_preferences/user_preferences.txt create mode 100644 Agent_E/ae/utils/__init__.py create mode 100644 Agent_E/ae/utils/anthropic_llm_helper.py create mode 100644 Agent_E/ae/utils/autogen_sequential_function_call.py create mode 100644 Agent_E/ae/utils/cli_helper.py create mode 100644 Agent_E/ae/utils/detect_llm_loops.py create mode 100644 Agent_E/ae/utils/dom_helper.py create mode 100644 Agent_E/ae/utils/dom_mutation_observer.py create mode 100644 Agent_E/ae/utils/formatting_helper.py create mode 100644 Agent_E/ae/utils/gemini_llm_helper.py create mode 100644 Agent_E/ae/utils/get_detailed_accessibility_tree.py create mode 100644 Agent_E/ae/utils/http_helper.py create mode 100644 Agent_E/ae/utils/js_helper.py create mode 100644 Agent_E/ae/utils/logger.py create mode 100644 Agent_E/ae/utils/openai_llm_helper.py create mode 100644 Agent_E/ae/utils/response_parser.py create mode 100644 Agent_E/ae/utils/ui_messagetype.py create mode 100644 Agent_E/test/evaluators.py create mode 100644 Agent_E/test/test_utils.py create mode 100644 Agent_E/test/tests_processor.py create mode 100644 agente_replication.py create mode 100644 browser_env/__init__.py create mode 100644 browser_env/actions.py create mode 100644 browser_env/async_envs.py create mode 100644 browser_env/auto_login.py create mode 100644 browser_env/constants.py create mode 100644 browser_env/env_config.py create mode 100644 browser_env/envs.py create mode 100644 browser_env/helper_functions.py create mode 100644 browser_env/html_tools/__init__.py create mode 100644 browser_env/html_tools/configs/__init__.py create mode 100644 browser_env/html_tools/configs/config.py create mode 100644 browser_env/html_tools/configs/html_prompt.py create mode 100644 browser_env/html_tools/html_parser.py create mode 100644 browser_env/html_tools/identifier.py create mode 100644 browser_env/html_tools/prompt.py create mode 100644 browser_env/html_tools/utils.py create mode 100644 browser_env/processors.py create mode 100644 browser_env/py.typed create mode 100644 browser_env/scripts/__init__.py create mode 100644 browser_env/scripts/canva_handler.js create mode 100644 browser_env/scripts/get_data.js create mode 100644 browser_env/scripts/get_text.js create mode 100644 browser_env/scripts/label_marker.js create mode 100644 browser_env/scripts/local_marker.js create mode 100644 browser_env/scripts/mix_marker.js create mode 100644 browser_env/trajectory.py create mode 100644 browser_env/utils.py create mode 100644 config_files/tasks/stanford_cs_head.json create mode 100644 config_files/tasks/tsinghua_da_head.json create mode 100644 config_files/test.raw.json create mode 100644 config_files/webvoyager/Allrecipes--10.json create mode 100644 config_files/webvoyager/Allrecipes--17.json create mode 100644 config_files/webvoyager/Allrecipes--3.json create mode 100644 config_files/webvoyager/Allrecipes--40.json create mode 100644 config_files/webvoyager/Amazon--16.json create mode 100644 config_files/webvoyager/Apple--12.json create mode 100644 config_files/webvoyager/Apple--17.json create mode 100644 config_files/webvoyager/Apple--18.json create mode 100644 config_files/webvoyager/Apple--19.json create mode 100644 config_files/webvoyager/Apple--28.json create mode 100644 config_files/webvoyager/Apple--31.json create mode 100644 config_files/webvoyager/Apple--37.json create mode 100644 config_files/webvoyager/ArXiv--10.json create mode 100644 config_files/webvoyager/ArXiv--11.json create mode 100644 config_files/webvoyager/ArXiv--12.json create mode 100644 config_files/webvoyager/ArXiv--14.json create mode 100644 config_files/webvoyager/ArXiv--17.json create mode 100644 config_files/webvoyager/ArXiv--18.json create mode 100644 config_files/webvoyager/ArXiv--25.json create mode 100644 config_files/webvoyager/ArXiv--27.json create mode 100644 config_files/webvoyager/ArXiv--30.json create mode 100644 config_files/webvoyager/ArXiv--31.json create mode 100644 config_files/webvoyager/ArXiv--36.json create mode 100644 config_files/webvoyager/ArXiv--37.json create mode 100644 config_files/webvoyager/ArXiv--39.json create mode 100644 config_files/webvoyager/ArXiv--41.json create mode 100644 config_files/webvoyager/ArXiv--42.json create mode 100644 config_files/webvoyager/ArXiv--6.json create mode 100644 config_files/webvoyager/BBC News--28.json create mode 100644 config_files/webvoyager/BBC News--5.json create mode 100644 config_files/webvoyager/Booking--33.json create mode 100644 config_files/webvoyager/Booking--41.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--0.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--17.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--18.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--19.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--21.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--26.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--28.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--42.json create mode 100644 config_files/webvoyager/Cambridge Dictionary--6.json create mode 100644 config_files/webvoyager/Coursera--38.json create mode 100644 config_files/webvoyager/Coursera--39.json create mode 100644 config_files/webvoyager/ESPN--11.json create mode 100644 config_files/webvoyager/ESPN--15.json create mode 100644 config_files/webvoyager/ESPN--17.json create mode 100644 config_files/webvoyager/ESPN--18.json create mode 100644 config_files/webvoyager/ESPN--19.json create mode 100644 config_files/webvoyager/ESPN--27.json create mode 100644 config_files/webvoyager/ESPN--28.json create mode 100644 config_files/webvoyager/ESPN--31.json create mode 100644 config_files/webvoyager/ESPN--41.json create mode 100644 config_files/webvoyager/ESPN--9.json create mode 100644 config_files/webvoyager/Google Map--1.json create mode 100644 config_files/webvoyager/Google Map--21.json create mode 100644 config_files/webvoyager/Google Map--26.json create mode 100644 config_files/webvoyager/Google Map--28.json create mode 100644 config_files/webvoyager/Google Map--31.json create mode 100644 config_files/webvoyager/Google Map--33.json create mode 100644 config_files/webvoyager/Google Map--7.json create mode 100644 config_files/webvoyager/Google Map--8.json create mode 100644 config_files/webvoyager/Google Map--9.json create mode 100644 config_files/webvoyager/Google Search--0.json create mode 100644 config_files/webvoyager/Google Search--12.json create mode 100644 config_files/webvoyager/Google Search--14.json create mode 100644 config_files/webvoyager/Google Search--15.json create mode 100644 config_files/webvoyager/Google Search--17.json create mode 100644 config_files/webvoyager/Google Search--18.json create mode 100644 config_files/webvoyager/Google Search--19.json create mode 100644 config_files/webvoyager/Google Search--20.json create mode 100644 config_files/webvoyager/Google Search--21.json create mode 100644 config_files/webvoyager/Google Search--24.json create mode 100644 config_files/webvoyager/Google Search--28.json create mode 100644 config_files/webvoyager/Google Search--29.json create mode 100644 config_files/webvoyager/Google Search--3.json create mode 100644 config_files/webvoyager/Google Search--31.json create mode 100644 config_files/webvoyager/Google Search--40.json create mode 100644 config_files/webvoyager/Google Search--7.json create mode 100644 config_files/webvoyager/Huggingface--10.json create mode 100644 config_files/webvoyager/Huggingface--13.json create mode 100644 config_files/webvoyager/Huggingface--14.json create mode 100644 config_files/webvoyager/Huggingface--18.json create mode 100644 config_files/webvoyager/Huggingface--20.json create mode 100644 config_files/webvoyager/Huggingface--21.json create mode 100644 config_files/webvoyager/Huggingface--24.json create mode 100644 config_files/webvoyager/Huggingface--25.json create mode 100644 config_files/webvoyager/Huggingface--27.json create mode 100644 config_files/webvoyager/Huggingface--30.json create mode 100644 config_files/webvoyager/Huggingface--32.json create mode 100644 config_files/webvoyager/Huggingface--38.json create mode 100644 config_files/webvoyager/Huggingface--41.json create mode 100644 config_files/webvoyager/Huggingface--42.json create mode 100644 config_files/webvoyager/Huggingface--6.json create mode 100644 config_files/webvoyager/Huggingface--7.json create mode 100644 config_files/webvoyager/Huggingface--9.json create mode 100644 config_files/webvoyager/Wolfram Alpha--0.json create mode 100644 config_files/webvoyager/Wolfram Alpha--10.json create mode 100644 config_files/webvoyager/Wolfram Alpha--11.json create mode 100644 config_files/webvoyager/Wolfram Alpha--12.json create mode 100644 config_files/webvoyager/Wolfram Alpha--15.json create mode 100644 config_files/webvoyager/Wolfram Alpha--17.json create mode 100644 config_files/webvoyager/Wolfram Alpha--2.json create mode 100644 config_files/webvoyager/Wolfram Alpha--20.json create mode 100644 config_files/webvoyager/Wolfram Alpha--21.json create mode 100644 config_files/webvoyager/Wolfram Alpha--22.json create mode 100644 config_files/webvoyager/Wolfram Alpha--23.json create mode 100644 config_files/webvoyager/Wolfram Alpha--24.json create mode 100644 config_files/webvoyager/Wolfram Alpha--25.json create mode 100644 config_files/webvoyager/Wolfram Alpha--27.json create mode 100644 config_files/webvoyager/Wolfram Alpha--28.json create mode 100644 config_files/webvoyager/Wolfram Alpha--3.json create mode 100644 config_files/webvoyager/Wolfram Alpha--32.json create mode 100644 config_files/webvoyager/Wolfram Alpha--33.json create mode 100644 config_files/webvoyager/Wolfram Alpha--34.json create mode 100644 config_files/webvoyager/Wolfram Alpha--35.json create mode 100644 config_files/webvoyager/Wolfram Alpha--36.json create mode 100644 config_files/webvoyager/Wolfram Alpha--37.json create mode 100644 config_files/webvoyager/Wolfram Alpha--38.json create mode 100644 config_files/webvoyager/Wolfram Alpha--39.json create mode 100644 config_files/webvoyager/Wolfram Alpha--4.json create mode 100644 config_files/webvoyager/Wolfram Alpha--40.json create mode 100644 config_files/webvoyager/Wolfram Alpha--41.json create mode 100644 config_files/webvoyager/Wolfram Alpha--42.json create mode 100644 config_files/webvoyager/Wolfram Alpha--43.json create mode 100644 config_files/webvoyager/Wolfram Alpha--45.json create mode 100644 config_files/webvoyager/Wolfram Alpha--5.json create mode 100644 config_files/webvoyager/Wolfram Alpha--6.json create mode 100644 config_files/webvoyager/Wolfram Alpha--7.json create mode 100644 config_files/webvoyager/Wolfram Alpha--9.json create mode 100644 eval_webarena.py create mode 100644 evaluation_harness/__init__.py create mode 100644 evaluation_harness/evaluators.py create mode 100644 evaluation_harness/helper_functions.py create mode 100644 files/overview.png create mode 100644 llms/__init__.py create mode 100644 llms/lm_config.py create mode 100644 llms/providers/anthropic_utils.py create mode 100644 llms/providers/hf_utils.py create mode 100644 llms/providers/openai_utils.py create mode 100644 llms/tokenizers.py create mode 100644 llms/utils.py create mode 100644 requirements.txt create mode 100644 scripts/run_config.sh create mode 100644 scripts/run_webarena.sh create mode 100644 webagents_step/__init__.py create mode 100644 webagents_step/agents/agent.py create mode 100644 webagents_step/agents/prompt_agent.py create mode 100644 webagents_step/agents/step_agent.py create mode 100644 webagents_step/environment/env.py create mode 100644 webagents_step/environment/liveweb.py create mode 100644 webagents_step/parser/playwright_parser_webarena.py create mode 100644 webagents_step/prompts/webarena/step_fewshot_template.py create mode 100644 webagents_step/prompts/webarena/step_fewshot_template_adapted.py create mode 100644 webagents_step/utils/data_prep.py create mode 100644 webagents_step/utils/llm.py create mode 100644 webagents_step/utils/stack.py create mode 100644 webarena/agent/__init__.py create mode 100644 webarena/agent/agent.py create mode 100644 webarena/agent/prompts/__init__.py create mode 100644 webarena/agent/prompts/jsons/new_action_prompt.json create mode 100644 webarena/agent/prompts/jsons/p_cot_id_actree_2s.json create mode 100644 webarena/agent/prompts/jsons/p_cot_id_actree_2s_no_na.json create mode 100644 webarena/agent/prompts/jsons/p_direct_id_actree_2s.json create mode 100644 webarena/agent/prompts/jsons/p_direct_id_actree_2s_no_na.json create mode 100644 webarena/agent/prompts/jsons/p_direct_id_actree_3s_llama.json create mode 100644 webarena/agent/prompts/jsons/test_prompt.json create mode 100644 webarena/agent/prompts/prompt_constructor.py create mode 100644 webarena/agent/prompts/raw/new_action_prompt.py create mode 100644 webarena/agent/prompts/raw/p_cot_id_actree_2s.py create mode 100644 webarena/agent/prompts/raw/p_cot_id_actree_2s_no_na.py create mode 100644 webarena/agent/prompts/raw/p_direct_id_actree_2s.py create mode 100644 webarena/agent/prompts/raw/p_direct_id_actree_2s_no_na.py create mode 100644 webarena/agent/prompts/raw/p_direct_id_actree_3s_llama.py create mode 100644 webarena/agent/prompts/raw/test_prompt.py create mode 100644 webarena/agent/prompts/to_json.py create mode 100644 webarena_replication.py diff --git a/AgentOccam/AgentOccam.py b/AgentOccam/AgentOccam.py new file mode 100644 index 0000000..e00d806 --- /dev/null +++ b/AgentOccam/AgentOccam.py @@ -0,0 +1,1448 @@ +from AgentOccam.obs_opt import parse_node_descendants, parse_node_ancestors, parse_node_siblings, action_set_invisible, action_set_visible, action_set_visible_if_with_name, translate_node_to_str, construct_new_DOM_with_visible_nodes +from AgentOccam.llms.claude import call_claude, call_claude_with_messages, arrange_message_for_claude +from AgentOccam.llms.mistral import call_mistral, call_mistral_with_messages, arrange_message_for_mistral +from AgentOccam.llms.cohere import call_cohere, call_cohere_with_messages, arrange_message_for_cohere +from AgentOccam.llms.llama import call_llama, call_llama_with_messages, arrange_message_for_llama +from AgentOccam.llms.titan import call_titan, call_titan_with_messages, arrange_message_for_titan +from AgentOccam.llms.gpt import call_gpt, call_gpt_with_messages, arrange_message_for_gpt +from AgentOccam.llms.gemini import call_gemini, call_gemini_with_messages, arrange_message_for_gemini +from AgentOccam.utils import CURRENT_DIR, HOMEPAGE_URL + +from typing import Dict +import re +import copy +import os +from functools import partial +import random +import json + +import warnings +warnings.filterwarnings("ignore") + + +DEFAULT_DOCUMENTED_INTERACTION_ELEMENTS = ["observation", "action"] +DEFAULT_ONLINE_INTERACTION_ELEMENTS = ["url", "observation"] +MODEL_FAMILIES = ["claude", "mistral", "cohere", "llama", "titan", "gpt", "gemini"] +CALL_MODEL_MAP = { + "claude": call_claude, + "mistral": call_mistral, + "cohere": call_cohere, + "llama": call_llama, + "titan": call_titan, + "gpt": call_gpt, + "gemini": call_gemini, +} +CALL_MODEL_WITH_MESSAGES_FUNCTION_MAP = { + "claude": call_claude_with_messages, + "mistral": call_mistral_with_messages, + "cohere": call_cohere_with_messages, + "llama": call_llama_with_messages, + "titan": call_titan_with_messages, + "gpt": call_gpt_with_messages, + "gemini": call_gemini_with_messages, +} +ARRANGE_MESSAGE_FOR_MODEL_MAP = { + "claude": arrange_message_for_claude, + "mistral": arrange_message_for_mistral, + "cohere": arrange_message_for_cohere, + "llama": arrange_message_for_llama, + "titan": arrange_message_for_titan, + "gpt": arrange_message_for_gpt, + "gemini": arrange_message_for_gemini, +} + +class Agent: + def __init__(self, config, objective, prompt_template): + self.config = config + self.objective = objective + self.prompt_template = prompt_template + + if hasattr(self.config, "documented_interaction_elements"): + self.previous_interactions = {k: [] for k in set(DEFAULT_DOCUMENTED_INTERACTION_ELEMENTS+self.config.documented_interaction_elements)} + else: + self.previous_interactions = {k: [] for k in DEFAULT_DOCUMENTED_INTERACTION_ELEMENTS} + if hasattr(self.config, "online_interaction_elements"): + self.online_interaction = {k: None for k in set(DEFAULT_ONLINE_INTERACTION_ELEMENTS+self.config.online_interaction_elements)} + else: + self.online_interaction = {k: None for k in DEFAULT_ONLINE_INTERACTION_ELEMENTS} + + self.model_family = [model_family for model_family in MODEL_FAMILIES if model_family in self.config.model][0] + self.call_model = partial(CALL_MODEL_MAP[self.model_family], model_id=self.config.model) + self.call_model_with_message = partial(CALL_MODEL_WITH_MESSAGES_FUNCTION_MAP[self.model_family], model_id=self.config.model) + self.arrange_message_for_model = ARRANGE_MESSAGE_FOR_MODEL_MAP[self.model_family] + + def shift_model(self, model_id): + self.model_family = [model_family for model_family in MODEL_FAMILIES if model_family in model_id][0] + self.call_model = partial(CALL_MODEL_MAP[self.model_family], model_id=model_id) + self.call_model_with_message = partial(CALL_MODEL_WITH_MESSAGES_FUNCTION_MAP[self.model_family], model_id=model_id) + self.arrange_message_for_model = ARRANGE_MESSAGE_FOR_MODEL_MAP[self.model_family] + + def prune_message_list(self, message_list): + return self.merge_adjacent_text([m for m in message_list if not (m[0]=="text" and len(m[1])==0)]) + + def merge_adjacent_text(self, message_list): + merged_list = [] + current_tuple = None + + for tup in message_list: + if tup[0] == "text": + if current_tuple: + current_tuple = (current_tuple[0], current_tuple[1] + tup[1]) + else: + current_tuple = tup + else: + if current_tuple: + merged_list.append(current_tuple) + current_tuple = None + merged_list.append(tup) + + if current_tuple: + merged_list.append(current_tuple) + + return merged_list + + + def get_step(self): + return len(self.previous_interactions["action"]) + + def update_objective(self, objective): + self.objective = objective + + def update_online_state(self, **online_states): + for k in online_states.keys(): + if k in self.online_interaction.keys(): + self.online_interaction[k] = online_states[k] + + def update_history(self, **interaction_dict): + for k in interaction_dict.keys(): + if k in self.previous_interactions.keys(): + self.previous_interactions[k].append(interaction_dict[k]) + + def equal_history_length(self): + lengths = [len(self.previous_interactions[k]) for k in self.previous_interactions.keys()] + return (len(set(lengths)) == 1) + + def parse_elements(self, text, key_list): + element_dict = {} + for k in key_list: + # _match = re.search(rf'{k.upper()}:\s*(.*?)\s*(?=\n[A-Z\d\s\W]*: *\n|$)', text, re.DOTALL) + _match = re.search(rf'{k.upper()}:\s*(.*?)\s*(?=\n[A-Z\s]*:|$)', text, re.DOTALL) + element_dict[k] = _match.group(1).strip() if _match else "" + return element_dict + + def get_output_specifications(self): + output_specifications = "\n".join([f"{o.upper()}:\n" + "".join(open(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "output_specifications", "{}.txt".format(o.replace(" ", "_"))), "r").readlines()) for o in self.config.output]) + return output_specifications + + def parse_stipulated_action_list(self, text: str, action: str, actions: list) -> str: + pattern = rf'({re.escape(action)}\s*(.*?))(?=\n(?:{"|".join(map(re.escape, actions))})|$)' + return [match[0].strip() for match in re.findall(pattern, text, re.DOTALL)] + + def parse_str_to_action_list(self, text:str, actions: list): + remain_text = copy.deepcopy(text) + action_list = [] + while remain_text: + find_action = False + for action in actions: + if remain_text.startswith(action): + match = re.search(rf'({re.escape(action)}\s*(.*?))(?=\n(?:{"|".join(map(re.escape, actions))})|$)', remain_text, re.DOTALL) + action_list.append(match[0]) + remain_text = remain_text[len(match[0]):].strip() + find_action = True + if not find_action: + break + return action_list + + def get_observation_text(self, idx=None): + if isinstance(self.online_interaction["observation"], dict): + if idx: + return self.previous_interactions["observation"][idx]["text"] + return self.online_interaction["observation"]["text"] + elif isinstance(self.online_interaction["observation"], str): + if idx: + return self.previous_interactions["observation"][idx] + return self.online_interaction["observation"] + + def get_observation_image(self, idx=None): + if isinstance(self.online_interaction["observation"], dict): + if idx: + return self.previous_interactions["observation"][idx]["image"] + return self.online_interaction["observation"]["image"] + elif isinstance(self.online_interaction["observation"], str): + return None + + def get_observation_node(self, idx=None): + if isinstance(self.online_interaction["observation"], dict): + if idx != None: + return self.previous_interactions["observation"][idx]["node"] + return self.online_interaction["observation"]["node"] + elif isinstance(self.online_interaction["observation"], str): + return None + + def get_observation_node_str(self, idx=None): + if isinstance(self.online_interaction["observation"], dict): + if idx != None: + return self.previous_interactions["observation"][idx]["node_str"] + return translate_node_to_str(self.online_interaction["observation"]["node"], mode="name_only") + elif isinstance(self.online_interaction["observation"], str): + return None + + def del_observation_node(self): + if isinstance(self.online_interaction["observation"], str): + return + if isinstance(self.online_interaction["observation"], dict): + for idx in range(len(self.previous_interactions["observation"])): + if "node" in self.previous_interactions["observation"][idx].keys() and self.previous_interactions["observation"][idx]["node"]: + node_str = translate_node_to_str(self.previous_interactions["observation"][idx]["node"], mode="name_only") + self.previous_interactions["observation"][idx]["node_str"] = node_str + self.previous_interactions["observation"][idx]["node"].delete_tree() + self.previous_interactions["observation"][idx]["node"] = None + +class PlanTreeNode: + def __init__(self, id, type, text, level, url, step): + self.visible = True + self.id = id + self.type = type + self.text = text + self.level = level + self.url = url + self.step = step + self.children = [] + self.parent = None + self.note = [] + self.hint = [] + self.resume_reason = [] + self.steps_taken = [] + + def reset(self): + self.visible = True + self.note = [] + self.hint = [] + self.steps_taken = [] + + def add_child(self, child): + child.parent = self + self.children.append(child) + + def search_node_by_id(self, target_id): + if self.visible and self.id == target_id: + return self + for child in self.children: + result = child.search_node_by_id(target_id) + if result: + return result + return None + + def traverse(self, action=None, tree_buffer=[]): + res_action = action(self) + if res_action: + if isinstance(res_action, list): + tree_buffer.extend(res_action) + else: + tree_buffer.append(res_action) + for child in self.children: + child.traverse(action, tree_buffer=tree_buffer) + +class QAActor(Agent): + def __init__(self, config, objective, prompt_template): + super().__init__(config, objective, prompt_template) + def get_instruction(self): + return self.prompt_template["instruction_template"] + def get_online_input(self): + return [("text", self.prompt_template["input_template"].replace("{current_observation}", self.get_observation_text()).replace("{objective}", self.objective))] + def get_action(self, instruction, online_input): + model_response = self.call_model_with_message(system_prompt=instruction, messages=self.arrange_message_for_model(online_input)) + action_elements = self.parse_elements(text=model_response, key_list=self.config.output) + action = action_elements["response"] + action_elements["action"] = f"note [{action}]" + action_elements["instruction"] = instruction + action_elements["input"] = online_input + return model_response, action_elements + +class PlanningActor(Agent): + def __init__(self, config, objective, prompt_template): + super().__init__(config, objective, prompt_template) + self.instruction = None + + def get_planning_specifications(self): + return "\n".join(["- " + "".join(open(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "planning_specifications", f"{p}.txt"), "r").readlines()) for p in self.config.planning_command]) + + def get_instruction(self): + if self.instruction: + return self.instruction + output_specifications = self.get_output_specifications() + self.instruction = self.prompt_template["instruction_template"].replace("{output_specifications}", output_specifications).replace("{planning_specifications}", self.get_planning_specifications()) + return self.instruction + + def get_online_input(self): + return None + + def get_action(self, instruction, online_input): + model_response = self.call_model_with_message(system_prompt=instruction, messages=self.arrange_message_for_model(online_input)) + action_elements = self.parse_elements(text=model_response, key_list=self.config.output) + action_elements["action"] = copy.deepcopy(action_elements["plan"]) + del action_elements["plan"] + action_elements["reason"] = "N/A" + action_elements["instruction"] = instruction + action_elements["input"] = online_input + return model_response, action_elements + +class ReflectionActor(Agent): + def __init__(self, config, objective, prompt_template): + super().__init__(config, objective, prompt_template) + self.instruction = None + + def get_planning_specifications(self): + return "\n".join(["- " + "".join(open(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "planning_specifications", f"{p}.txt"), "r").readlines()) for p in self.config.planning_command]) + + def get_navigation_specifications(self): + return "\n".join(["- " + "".join(open(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "navigation_specifications", f"{n}.txt"), "r").readlines()) for n in self.config.navigation_command]) + + def get_instruction(self): + if self.instruction: + return self.instruction + output_specifications = self.get_output_specifications() + planning_specifications = self.get_planning_specifications() + navigation_specifications = self.get_navigation_specifications() + instruction = self.prompt_template["instruction_template"] + instruction = instruction.replace("{output_specifications}", output_specifications) + instruction = instruction.replace("{planning_specifications}", planning_specifications) + instruction = instruction.replace("{navigation_specifications}", navigation_specifications) + self.instruction = instruction + return self.instruction + + def get_online_input(self): + return None + + def get_action(self, instruction, online_input): + model_response = self.call_model_with_message(system_prompt=instruction, messages=self.arrange_message_for_model(online_input)) + action_elements = self.parse_elements(text=model_response, key_list=self.config.output) + action_elements["instruction"] = instruction + action_elements["input"] = online_input + return model_response, action_elements + +IDENTITY_CLASS_MAP = { + "QA": QAActor, + "planning": PlanningActor, + "reflection": ReflectionActor, +} + +class Actor(Agent): + def __init__(self, config, objective, prompt_template, plan_tree_node): + super().__init__(config, objective, prompt_template) + self.plan_tree_root = plan_tree_node + self.active_node = plan_tree_node + self.output_specifications = None + self.planning_specifications = None + self.navigation_specifications = None + self.criticism_element_list = None + + self.output_play_path = os.path.join(CURRENT_DIR, f"play-{self.config.others.logname}.txt") if getattr(self.config.others, "logname", "") != "" else os.path.join(CURRENT_DIR, f"play.txt") + self.output_trash_path = os.path.join(CURRENT_DIR, f"trash-{self.config.others.logname}.txt") if getattr(self.config.others, "logname", "") != "" else os.path.join(CURRENT_DIR, f"trash.txt") + + self.identities = [] + if hasattr(self.config, "identities"): + i = 0 + while hasattr(self.config.identities, f"identity_{i}"): + identity_config = getattr(self.config.identities, f"identity_{i}") + self.identities.append(IDENTITY_CLASS_MAP[identity_config.name](identity_config, objective=objective, prompt_template=prompt_template[identity_config.name])) + i += 1 + + def update_online_state(self, **online_states): + super().update_online_state(**online_states) + for identity in self.identities: + identity.update_online_state(**online_states) + + def is_planning(self, action): + for c in self.config.planning_command: + if action.startswith(c): + return c + return False + + def is_navigation(self, action): + action_without_note = re.sub(rf'(note\s*(.*?))(?=\n(?:{"|".join(map(re.escape, self.config.navigation_command))})|$)', "", action).strip() + for c in self.config.navigation_command: + if action_without_note.startswith(c): + return c + return False + + def is_valid_action(self, action_str): + action = ( + action_str.split("[")[0].strip() + if "[" in action_str + else action_str.split()[0].strip() + ) + match action: + case "click": + match = re.search(r"click ?\[(\d+)\]", action_str) + if not match: + return False + element_id = match.group(1) + if element_id in self.get_observation_text(): + return True + return False + case "type": + if not (action_str.endswith("[0]") or action_str.endswith("[1]")): + action_str += " [1]" + + match = re.search( + r"type ?\[(\d+)\] ?\[(.*)\] ?\[(\d+)\]", action_str, re.DOTALL + ) + if not match: + return False + element_id, text, enter_flag = ( + match.group(1), + match.group(2), + match.group(3), + ) + enter_flag = True if enter_flag == "1" else False + if enter_flag: + text += "\n" + if element_id in self.get_observation_text(): + return True + case "go_back": + return True + case "go_home": + return True + case "note": + return True + case "stop": + return True + case "branch": + return True + case "prune": + return True + case "goto": + return True + case "scroll": + return True + + def are_valid_actions(self, actions): + action_list = self.parse_str_to_action_list(actions, self.config.planning_command+self.config.navigation_command+["goto"]) + if not action_list: + return False + for action in action_list: + if not self.is_valid_action(action): + return False + return True + + def get_previous_plans(self, verbose=False): + def action_return_visible_node(node, verbose=False): + if node.id == self.active_node.id: + basic = "\t" * node.level + f"[{node.id}] (Active Plan) {node.text}" if node.visible else None + else: + basic = "\t" * node.level + f"[{node.id}] {node.text}" if node.visible else None + if basic and len(node.resume_reason) > 0: + basic += f" # Was resumed to this step {len(node.resume_reason)} time(s) for:" + for i, reason in enumerate(node.resume_reason): + basic += f" {i}. {reason}" + if verbose and basic and len(node.note) > 0: + for i, note in enumerate(node.note): + basic += "\n" + "\t" * node.level + f"Note {i}. {note}" + return basic + plan_tree_buffer = [] + parse_node_descendants(self.plan_tree_root, partial(action_return_visible_node, verbose=verbose), tree_buffer=plan_tree_buffer) + return "\n".join(plan_tree_buffer) + + def get_active_plan(self): + return f"[{self.active_node.id}] {self.active_node.text}" + + def get_interaction_history(self, interaction_history_config=False, mode="highlight"): + interaction_history_config = interaction_history_config if interaction_history_config else self.config.interaction_history + + previous_observation = [] + for i in self.active_node.steps_taken: + if self.get_observation_node_str() and self.get_observation_node_str(i) and not self.get_observation_node_str() == self.get_observation_node_str(i): + if self.previous_interactions["observation highlight"][i] and mode == "highlight" and len(translate_node_to_str(self.previous_interactions["observation highlight"][i], mode="name_only", retained_ids=self.previous_interactions["retained element ids"][i]).split()) < 200: + try: + previous_observation.append({"text": translate_node_to_str(self.previous_interactions["observation highlight"][i], mode="name_only", retained_ids=self.previous_interactions["retained element ids"][i]), "image": self.get_observation_image(i)}) + except: + print(i, self.previous_interactions["observation"][i]["text"]) + raise ValueError("Cannot translate highlight node to text.") + else: + previous_observation.append({"text": self.previous_interactions["observation summary"][i], "image": self.get_observation_image(i)}) + elif not self.get_observation_node() or mode == "full": + if len(self.get_observation_text(i).split()) < 200: + previous_observation.append({"text": self.get_observation_text(i), "image": self.get_observation_image(i)}) + else: + previous_observation.append({"text": self.previous_interactions["observation summary"][i], "image": self.get_observation_image(i)}) + else: + previous_observation.append({"text": "The same as the CURRENT OBSERVATION (see below CURRENT OBSERVATION section).", "image": self.get_observation_image(i)}) + + previous_observation_summary = [self.previous_interactions["observation summary"][i] for i in self.active_node.steps_taken] + + def get_text(obs): + if isinstance(obs, dict): + return obs["text"] + elif isinstance(obs, str): + return obs + + def get_image(obs): + if isinstance(obs, dict): + return obs["image"] + elif isinstance(obs, str): + return obs + + if interaction_history_config.step_num == "all": + textual_observations = [get_text(obs) for obs in previous_observation] if interaction_history_config.verbose else previous_observation_summary + visual_observations = [get_image(obs) for obs in previous_observation] + else: + textual_observations = previous_observation_summary[:-interaction_history_config.step_num] + visual_observations = [None] * len(previous_observation_summary[:-interaction_history_config.step_num]) + textual_observations += [get_text(obs) for obs in previous_observation][-interaction_history_config.step_num:] if interaction_history_config.verbose else previous_observation_summary[-interaction_history_config.step_num:] + visual_observations += [get_image(obs) for obs in previous_observation][-interaction_history_config.step_num:] + + plans = [self.previous_interactions["plan"][i] for i in self.active_node.steps_taken] + reasons = [self.previous_interactions["reason"][i] for i in self.active_node.steps_taken] + actions = [self.previous_interactions["action"][i] for i in self.active_node.steps_taken] + + if "image" in interaction_history_config.type: + message_list = [] + for step, (obs, vi_obs, plan, reason, action) in enumerate(zip(textual_observations, visual_observations, plans, reasons, actions)): + message_list.append(("text", f"\n")) + if vi_obs: + message_list.append(("text", "VISUAL OBSERVATION:\n")) + message_list.append(("image", vi_obs)) + if self.active_node.id != 0: + message_list.append(("text", f"TEXTUAL OBSERVATION:\n{obs}\nACTIVE PLAN:\n{plan}\nREASON FOR ACTION:\n{reason}\nACTION:\n{action}\n\n")) + else: + message_list.append(("text", f"TEXTUAL OBSERVATION:\n{obs}\nREASON FOR ACTION:\n{reason}\nACTION:\n{action}\n\n")) + return self.prune_message_list(message_list=message_list) + else: + message = "" + for step, (obs, plan, reason, action) in enumerate(zip(textual_observations, plans, reasons, actions)): + if self.active_node.id != 0: + message += f"\nOBSERVATION:\n{obs}\nACTIVE PLAN:\n{plan}\nREASON FOR ACTION:\n{reason}\nACTION:\n{action}\n\n" # f"\nOBSERVATION:\n{obs}\nACTIVE PLAN:\n{plan}\nREASON FOR ACTION:\n{reason}\nACTION:\n{action}\n\n" + else: + message += f"\nOBSERVATION:\n{obs}\nREASON FOR ACTION:\n{reason}\nACTION:\n{action}\n\n" # f"\nOBSERVATION:\n{obs}\nREASON FOR ACTION:\n{reason}\nACTION:\n{action}\n\n" + return self.prune_message_list(message_list=[("text", message)]) + + def pre_process_atomic_actions(self, atomic_action_list=["combobox"]): + if self.get_observation_node() and "combobox" in atomic_action_list: + self.online_interaction["observation"]["text"] = translate_node_to_str(self.get_observation_node(), mode="concise", hidden_roles=["menu", "combobox", "listbox"]) + + def get_online_input(self, criticism_elements): + input_template = self.prompt_template["input_template"] + input_prefix, input_suffix = input_template.split("{input}") + INPUT_TYPE_TO_CONTENT_MAP = { + "step": self.get_step(), + "objective": self.objective, + "previous plans": self.get_previous_plans(verbose=True), + "interaction history": self.get_interaction_history(), + "current observation": self.get_observation_text(), + "current visual observation": self.get_observation_image() + } + input_list = [] + for input_type in self.config.input: + input_content = None + if input_type == "current visual observation": + continue + elif input_type in INPUT_TYPE_TO_CONTENT_MAP.keys(): + input_content = INPUT_TYPE_TO_CONTENT_MAP[input_type] + elif input_type.startswith("critic: ") and criticism_elements and input_type[len("critic: "):] in criticism_elements.keys() and criticism_elements[input_type[len("critic: "):]]: + input_type = input_type[len("critic: "):] + input_content = criticism_elements[input_type] + input_type = "FROM USER: " + input_type + if input_content and isinstance(input_content, str): + input_list.append(("text", f"{input_type.upper()}:\n{input_content}\n")) + elif input_content and isinstance(input_content, list): + input_list.append(("text", f"{input_type.upper()}:\n")) + input_list += input_content if len(input_content) > 0 else ["N/A"] + + if "image" in self.config.current_observation.type: + input_type = "current visual observation" + input_list.append(("text", f"{input_type.upper()}:\n")) + input_list.append(("image", INPUT_TYPE_TO_CONTENT_MAP["current visual observation"])) + + return self.prune_message_list(message_list=[("text", input_prefix)] + input_list + [("text", input_suffix)]) + + def get_planning_specifications(self): + if self.planning_specifications: + return self.planning_specifications + self.planning_specifications = "\n".join(["- " + "".join(open(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "planning_specifications", f"{p}.txt"), "r").readlines()) for p in self.config.planning_command]) + return self.planning_specifications + + def get_navigation_specifications(self): + if self.navigation_specifications: + return self.navigation_specifications + self.navigation_specifications = "\n".join(["- " + "".join(open(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "navigation_specifications", f"{n}.txt"), "r").readlines()) for n in self.config.navigation_command]) + return self.navigation_specifications + + def get_actor_instruction(self, examples=None): + if self.config.planning_command: + instruction = self.prompt_template["instruction_template"]["with_planning"] + else: + instruction = self.prompt_template["instruction_template"]["without_planning"] + output_specifications = self.get_output_specifications() + planning_specifications = self.get_planning_specifications() + navigation_specifications = self.get_navigation_specifications() + instruction = instruction.replace("{output_specifications}", output_specifications) + instruction = instruction.replace("{planning_specifications}", planning_specifications) + instruction = instruction.replace("{navigation_specifications}", navigation_specifications) + + example_source = examples if examples is not None else self.prompt_template.get("examples", []) + if len(example_source) > 0: + instruction += f"\n\n## Here are a few examples:" + for i, example in enumerate(example_source): + example_input = example["input"] + example_output = example["output"] + if "example_template" in self.prompt_template.keys(): + instruction += "\n\n" + instruction += self.prompt_template.get("example_template", "| Example {i}\n### Input:\n{example_input}\n### Response: Let's think step by step.\n{example_response}").replace("{i}", i).replace("{example_input}", example_input).replace("{example_output}", example_output) + else: + instruction += f"\n\n| Example {i}\n\n### Input:\n{example_input}\n\n### Response: Let's think step by step.\n{example_output}" + + if self.get_step() == self.config.others.max_steps - 1: + instruction += f"\n\nWARNING: You have a {self.config.others.max_steps}-step budget, and this would be your FINAL STEP. Wrap up your observations and return your answer with `stop [answer]` to maximize the reward." + # else: + # instruction += f"\n\nWARNING: You have a {self.config.others.max_steps}-step budget, and there are {self.config.others.max_steps-self.get_step()} remaining attempts." + + return instruction + + def verbose(self, instruction, online_input, model_response_list, action_element_list): + action_element_keys = [k for k in self.config.play if k in action_element_list[0].keys()] + other_play_keys = [k for k in self.config.play if k not in action_element_list[0].keys()] + + VERBOSE_TO_CONTENT_MAP = { + "step": self.get_step(), + "objective": self.objective, + "previous plans": self.get_previous_plans(verbose=True), + "url": self.online_interaction["url"], + "observation": self.get_observation_text(), + "response": "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n".join([f"|\tAgent {i}:\n{model_response}" for i, model_response in enumerate(model_response_list[:self.config.number])]) if self.config.number > 1 else model_response_list[0], + "instruction": instruction, + "online input": "\n".join([i[1] for i in online_input if i[0]=="text"]), + "alter ego response": "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n".join(["|\tAgent {}:\n{}".format(identity.config.name, response) for identity, response in zip(self.identities, model_response_list[self.config.number:])]) + } + + if self.config.others.verbose > 0 and self.config.verbose > 0: + with open(self.output_trash_path, "a") as af: + af.write("-"*32+"ACTOR"+"-"*32+"\n") + for t in self.config.trash: + content = VERBOSE_TO_CONTENT_MAP.get(t, "") + with open(self.output_trash_path, "a") as af: + af.write(f"{t.upper()}:\n{content}\n\n") + with open(self.output_play_path, "w") as _: + pass + for p in other_play_keys: + content = VERBOSE_TO_CONTENT_MAP.get(p, "") + with open(self.output_play_path, "a") as af: + af.write(f"{p.upper()}:\n{content}\n\n") + for i, action_elements in enumerate(action_element_list): + if len(action_element_list) > 1: + with open(self.output_play_path, "a") as af: + af.write("-"*32+f"AGENT {i}"+"-"*32+"\n") + for action_element_key in action_element_keys: + content = action_elements.get(action_element_key, "N/A") + with open(self.output_play_path, "a") as af: + af.write(f"{action_element_key.upper()}:\n{content}\n\n") + + def parse_plan(self, planning): + planning_type = self.is_planning(action=planning) + match = re.search( + rf"{planning_type} ?\[(\d+)\] ?\[(.+)\]", planning, re.DOTALL + ) + if not match: + raise ValueError("Invalid planning command.") + node_id, planning_content = ( + int(match.group(1)), + match.group(2) + ) + return planning_type, node_id, planning_content + + def prune_planning(self, node:PlanTreeNode, planning_content): + def set_invisible(node:PlanTreeNode): + node.visible = False + def return_steps_taken(node:PlanTreeNode): + return [node.step] + node.steps_taken + after_node = False + if node.id > 0: + for child in node.parent.children: + if not after_node and child != node: + continue + elif child == node: + after_node = True + continue + child.visible = False + node.traverse(set_invisible) + node.reset() + steps_taken = [] + node.traverse(action=return_steps_taken, tree_buffer=steps_taken) + node.steps_taken = sorted(list(set(steps_taken)), reverse=False) + node.resume_reason.append(planning_content) + navigation = f"goto [{node.url}] [1]" + self.active_node = node + return navigation + + def branch_planning(self, node, planning_content): + new_node = PlanTreeNode(id=self.active_node.id+1, type=type, text=planning_content, level=node.level+1, url=self.online_interaction["url"], step=self.get_step()) + self.active_node = new_node + node.add_child(new_node) + + def planning(self, action): + if action and self.is_planning(action): + try: + planning_type, node_id, planning_content = self.parse_plan(planning=action) + node = self.plan_tree_root.search_node_by_id(node_id) + if not node: + raise ValueError(f"Invalid node id {node_id}: {action}.") + if planning_type == "prune": + navigation_action = self.prune_planning(node=node, planning_content=planning_content) + return navigation_action + elif planning_type == "branch": + self.branch_planning(node=node, planning_content=planning_content) + else: + raise ValueError(f"Invalid planning operation {planning_type}: {action}.") + except Exception as e: + print("Invalid plan node:", str(e)) + flaw_node = self.active_node + flaw_node.note.append(f"You previously generate plan \"{action}\", which has INVALID syntax. User planning command like `branch [parent_plan_id] [new_subplan_intent]` or `prune [resume_plan_id] [reason]`.") + else: + self.active_node.steps_taken.append(self.get_step()) + return None + + def go_home(self, action): + if "go_home" in action: + return f"goto [{HOMEPAGE_URL}] [1]" + return None + + def parse_action(self, action_str): + try: + DOM_root_node = self.get_observation_node() + action_str = action_str.strip() + action = ( + action_str.split("[")[0].strip() + if "[" in action_str + else action_str.split()[0].strip() + ) + match action: + case "click": + match = re.search(r"click ?\[(\d+)\]", action_str) + if not match: + raise ValueError(f"Invalid click action {action_str}") + element_id = match.group(1) + node = DOM_root_node.search_node_by_id(element_id) + return f"click [{element_id}] ({node.role} {node.name})" + case "hover": + match = re.search(r"hover ?\[(\d+)\]", action_str) + if not match: + raise ValueError(f"Invalid hover action {action_str}") + element_id = match.group(1) + node = DOM_root_node.search_node_by_id(element_id) + return f"hover [{element_id}] ({node.role} {node.name})" + case "type": + if not (action_str.endswith("[0]") or action_str.endswith("[1]")): + action_str += " [1]" + + match = re.search( + r"type ?\[(\d+)\] ?\[(.+)\] ?\[(\d+)\]", action_str + ) + if not match: + raise ValueError(f"Invalid type action {action_str}") + element_id, text, enter_flag = ( + match.group(1), + match.group(2), + match.group(3), + ) + enter_flag = True if enter_flag == "1" else False + if enter_flag: + text += "\n" + node = DOM_root_node.search_node_by_id(element_id) + return action + f" ({node.name})" + case "scroll": + return action_str + case "goto": + return action + case "new_tab": + return action + case "go_back": + return action + case "go_forward": + return action + case "stop": + return action + + return False + except: + return False + + def parse_actions_to_element_ids(self, actions): + action_str_list = [] + for a in self.config.navigation_command: + action_str_list += self.parse_stipulated_action_list(text=actions, action=a, actions=self.config.planning_command+self.config.navigation_command+["goto"]) + retained_element_ids = [] + for action_str in action_str_list: + try: + action_str = action_str.strip() + action = ( + action_str.split("[")[0].strip() + if "[" in action_str + else action_str.split()[0].strip() + ) + match action: + case "click": + match = re.search(r"click ?\[(\d+)\]", action_str) + if not match: + raise ValueError(f"Invalid click action {action_str}") + element_id = match.group(1) + element_id = int(element_id) + retained_element_ids.append(element_id) + case "hover": + match = re.search(r"hover ?\[(\d+)\]", action_str) + if not match: + raise ValueError(f"Invalid hover action {action_str}") + element_id = match.group(1) + element_id = int(element_id) + retained_element_ids.append(element_id) + case "type": + if not (action_str.endswith("[0]") or action_str.endswith("[1]")): + action_str += " [1]" + + match = re.search( + r"type ?\[(\d+)\] ?\[(.+)\] ?\[(\d+)\]", action_str + ) + if not match: + raise ValueError(f"Invalid type action {action_str}") + element_id, text, enter_flag = ( + match.group(1), + match.group(2), + match.group(3), + ) + element_id = int(element_id) + retained_element_ids.append(element_id) + case "scroll": + pass + case "goto": + pass + case "new_tab": + pass + case "go_back": + pass + case "go_forward": + pass + case "stop": + pass + case "note": + pass + + return retained_element_ids + except: + continue + + return retained_element_ids + + def take_note(self, action, note_as_action=True): + if action and "note [" in action: + none_note_action_list = [] + action_list = self.parse_str_to_action_list(action, actions=self.config.planning_command+self.config.navigation_command+["goto"]) + for a in action_list: + if "note [" in a: + note = re.search(r"note ?\[?(.+)", a, re.DOTALL).group(1) + if note.endswith("]"): + note = note[:-1] + self.active_node.note.append(f"STEP {self.get_step()}: {note}") + self.note_buffer = note + else: + none_note_action_list.append(a) + if note_as_action: + return action + return "\n".join(none_note_action_list) + # action_note = self.parse_action(action) + # if action_note: + # self.active_node.note.append(f"STEP {self.get_step()} ACTION: {action_note}") + return action + + def get_observation_highlight(self, action_elements:dict): + action_elements["observation highlight idxs"] = copy.deepcopy(action_elements.get("observation highlight", "")) + DOM_root_node = self.get_observation_node() + if not DOM_root_node: + action_elements["observation highlight"] = None + return + observation_highlight_idxs = [int(idx.strip()) for idx in action_elements.get("observation highlight", "").split(",") if idx.strip().isdigit()] + if observation_highlight_idxs: + parse_node_descendants(node=DOM_root_node, action=action_set_invisible) + for idx in observation_highlight_idxs: + try: + node = DOM_root_node.search_node_by_id(idx) + parse_node_descendants(node=node, action=action_set_visible) + parse_node_ancestors(node=node, action=action_set_visible) + parse_node_siblings(node=node, action=action_set_visible_if_with_name) + except: + pass + try: + assert DOM_root_node.get_visible_node_number() < 30 and construct_new_DOM_with_visible_nodes(DOM_root=DOM_root_node) + action_elements["observation highlight"] = construct_new_DOM_with_visible_nodes(DOM_root=DOM_root_node) + parse_node_descendants(node=DOM_root_node, action=action_set_visible) + except: + parse_node_descendants(node=DOM_root_node, action=action_set_visible) + action_elements["observation highlight"] = None + + action_elements["retained element ids"] = self.parse_actions_to_element_ids(action_elements["action"]) + + def parse_action_from_action_candidates(self, action_elements): + if "action" in action_elements.keys(): + return action_elements + assert any("action candidates" in k for k in action_elements.keys()) + action_candidates_key = [k for k in action_elements.keys() if "action candidates" in k][0] + def parse_reasons_and_actions(input_string): + pattern = r'- reason: \[(.*?)\]\s*(?:- action: \[(.*?)\])?\s*(?:\n|\Z)' + + matches = re.findall(pattern, input_string, re.DOTALL) + + parsed_data = [] + for match in matches: + reason = match[0].strip() + action = match[1].strip() + if reason and action: + parsed_data.append({'reason': reason, 'action': action}) + + return parsed_data + action_elements[action_candidates_key] = parse_reasons_and_actions(action_elements[action_candidates_key]) + return action_elements + + def predict_action(self, criticism_elements): + if self.config.debug > 1: + action_elements = {k: "" for k in self.config.output} + human_input = input("ACTION: ") + action_elements["action"] = human_input + return [action_elements] + + self.pre_process_atomic_actions() + instruction = self.get_actor_instruction() + online_input = self.get_online_input(criticism_elements=criticism_elements) + model_response_list = [] + action_element_list = [] + for _ in range(self.config.number): + get_valid_actions = False + repetitive_note = False + invalid_actions = False + while not get_valid_actions: + if repetitive_note: + model_response = self.call_model_with_message(system_prompt=instruction+"\nGenerating the command `note [{}]` will be severely punished! Don't generate repetitive notes!".format(getattr(self, "note_buffer", "")), messages=self.arrange_message_for_model(online_input)) + elif invalid_actions: + model_response = self.call_model_with_message(system_prompt=instruction+"\nGenerating the command `{}` will be severely punished! Don't generate invalid actions! We don't have that element id in the current observation!".format(invalid_action_str), messages=self.arrange_message_for_model(online_input)) + else: + model_response = self.call_model_with_message(system_prompt=instruction, messages=self.arrange_message_for_model(online_input)) + action_elements = self.parse_elements(text=model_response, key_list=self.config.output) + action_elements = self.parse_action_from_action_candidates(action_elements=action_elements) + assert not ("action" in action_elements.keys() and any("action candidates" in k for k in action_elements.keys())) + if "action" in action_elements.keys(): + if self.are_valid_actions(action_elements["action"]): + note_buffer = getattr(self, "note_buffer", "") + if note_buffer and f"note [{note_buffer}" in action_elements["action"]: + print(f"Repetitive note: {note_buffer}") + repetitive_note = True + continue + get_valid_actions = True + action_elements["input"] = online_input + model_response_list.append(model_response) + action_element_list.append(action_elements) + else: + invalid_action_str = action_elements["action"] + print(f"Invalid actions: {invalid_action_str}") + invalid_actions = True + elif any("action candidates" in k for k in action_elements.keys()): + action_candidates_key = [k for k in action_elements.keys() if "action candidates" in k][0] + if isinstance(action_elements[action_candidates_key], str): + continue + filtered_action_candidates = [] + note_buffer = getattr(self, "note_buffer", "") + for action_reason_pair in action_elements[action_candidates_key]: + action = action_reason_pair["action"] + reason = action_reason_pair["reason"] + if self.are_valid_actions(action): + if note_buffer and f"note [{note_buffer}" in action: + print(f"Repetitive note: {note_buffer}") + repetitive_note = True + continue + filtered_action_candidates.append({'reason': reason, 'action': action}) + else: + invalid_action_str = action + print(f"Invalid actions: {invalid_action_str}") + invalid_actions = True + if filtered_action_candidates: + action_elements[action_candidates_key] = filtered_action_candidates + get_valid_actions = True + action_elements["input"] = online_input + model_response_list.append(model_response) + action_element_list.append(action_elements) + else: + raise NotImplementedError("You have to generate either action or action candidates.") + # if self.config.number != 1: + if True: + for identity in self.identities: + identity_instruction = identity.get_instruction() if identity.get_instruction() else instruction + identity_online_input = identity.get_online_input() if identity.get_online_input() else online_input + get_valid_actions = False + invalid_actions = False + while not get_valid_actions: + if invalid_actions: + model_response, action_elements = identity.get_action(identity_instruction+"\nGenerating the command `{}` will be severely punished! Don't generate invalid actions! We don't have that element id in the current observation!".format(invalid_action_str), identity_online_input) + else: + model_response, action_elements = identity.get_action(identity_instruction, identity_online_input) + if self.are_valid_actions(action_elements["action"]): + get_valid_actions = True + model_response_list.append(model_response) + action_element_list.append(action_elements) + else: + invalid_action_str = action_elements["action"] + print(f"Invalid actions: {invalid_action_str}") + invalid_actions = True + + self.verbose(instruction=instruction, online_input=online_input, model_response_list=model_response_list, action_element_list=action_element_list) + + if self.config.others.debug or self.config.debug: + for i in range(len(action_element_list)): + human_input = input(f"ACTION {i}: ") + if human_input != "": + action_element_list[i]["action"] = human_input + + return action_element_list + + def finalize_action(self, action_elements): + self.get_observation_highlight(action_elements=action_elements) + action = action_elements["action"] + navigation_action = self.planning(action=action) + if navigation_action: + action_elements["navigation action"] = navigation_action + action = self.take_note(action) + action_elements["action"] = action + navigation_action = self.go_home(action=action) + if navigation_action: + action_elements["navigation action"] = navigation_action + return action_elements + +class Critic(Agent): + def __init__(self, config, objective, prompt_template): + super().__init__(config, objective, prompt_template) + self.instruction = None + self.actor_basic_info_dict = None + + self.output_play_path = os.path.join(CURRENT_DIR, f"play-{self.config.others.logname}.txt") if getattr(self.config.others, "logname", "") != "" else os.path.join(CURRENT_DIR, f"play.txt") + self.output_trash_path = os.path.join(CURRENT_DIR, f"trash-{self.config.others.logname}.txt") if getattr(self.config.others, "logname", "") != "" else os.path.join(CURRENT_DIR, f"trash.txt") + + def verbose(self, instruction, online_input, model_response): + VERBOSE_TO_CONTENT_MAP = { + "url": self.online_interaction["url"], + "objective": self.objective, + "instruction": instruction, + "online input": "\n".join([i[1] for i in online_input if i[0]=="text"]), + "response": model_response + } + if self.config.others.verbose > 0 and self.config.verbose > 0: + with open(self.output_trash_path, "a") as af: + af.write("-"*32+"CRITIC"+"-"*32+"\n") + for t in self.config.trash: + content = VERBOSE_TO_CONTENT_MAP[t] + with open(self.output_trash_path, "a") as af: + af.write(f"{t.upper()}:\n{content}\n\n") + + def update_actor_basic_info(self, **actor_basic_info_dict): + self.actor_basic_info_dict = actor_basic_info_dict + + def get_output_specifications(self): + output_specification_filepath_list = [] + for o in self.config.output: + if os.path.exists(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "output_specifications", "{}_{}.txt".format(o.replace(" ", "_"), self.config.character))): + output_specification_filepath_list.append(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "output_specifications", "{}_{}.txt".format(o.replace(" ", "_"), self.config.character))) + else: + output_specification_filepath_list.append(os.path.join(CURRENT_DIR, "AgentOccam", "prompts", "output_specifications", "{}.txt".format(o.replace(" ", "_")))) + output_specifications = "\n".join([f"{o.upper()}:\n" + "".join(open(filepath, "r").readlines()) for o, filepath in zip(self.config.output, output_specification_filepath_list)]) + return output_specifications + + def get_critic_instruction(self): + if self.instruction: + return self.instruction + instruction = self.prompt_template["instruction_template"] + output_specifications = self.get_output_specifications() + instruction = instruction.replace("{output_specifications}", output_specifications) + instruction = instruction.replace("{planning_specifications}", self.actor_basic_info_dict["planning_specifications"]) + instruction = instruction.replace("{navigation_specifications}", self.actor_basic_info_dict["navigation_specifications"]) + self.instruction = instruction + return self.instruction + + def get_online_input(self): + input_template = self.prompt_template["input_template"] + input_prefix, input_suffix = input_template.split("{input}") + # ["objective", "previous plans", "interaction history", "step", "current observation"] + INPUT_TYPE_TO_CONTENT_MAP = { + "step": self.actor_basic_info_dict["step"], + "objective": self.objective, + "previous plans": self.actor_basic_info_dict["previous_plans"], + "interaction history": self.actor_basic_info_dict["interaction_history"], + "current observation": self.get_observation_text(), + "current visual observation": self.get_observation_image() + } + input_list = [] + for input_type in self.config.input: + input_content = None + if input_type == "current visual observation": + continue + elif input_type in INPUT_TYPE_TO_CONTENT_MAP.keys(): + input_content = INPUT_TYPE_TO_CONTENT_MAP[input_type] + if input_content and isinstance(input_content, str): + input_list.append(("text", f"{input_type.upper()}:\n{input_content}\n")) + elif input_content and isinstance(input_content, list): + input_list.append(("text", f"{input_type.upper()}:\n")) + input_list += input_content if len(input_content) > 0 else ["N/A"] + + if "image" in self.config.current_observation.type: + input_type = "current visual observation" + input_list.append(("text", f"{input_type.upper()}:\n")) + input_list.append(("image", INPUT_TYPE_TO_CONTENT_MAP["current visual observation"])) + + return self.prune_message_list(message_list=[("text", input_prefix)] + input_list + [("text", input_suffix)]) + + def get_criticism_elements(self): + if not self.config.mode: + return {} + if self.config.debug > 1: + criticism_elements = {k: random.choice(["I don't think the task is finished. Don't issue identical actions like taking the same notes. It's annoying. Continue.", "You have make a reasoning mistake. Continue.", "You have missed important details on this page. Continue.", "You don't follow the task requirements. Continue.", "The task assigner might just want to challenge you to answer no and there might be no answer for this brain teaser question. Who knows?", "You should break down the task by using the planning commands.", "You have not gone over all the relevant pages. Continue."]) for k in self.config.output} + # criticism_elements = {k: input(f"{k.upper()}: ") for k in self.config.output} + return criticism_elements + + instruction = self.get_critic_instruction() + online_input = self.get_online_input() + model_response = self.call_model_with_message(system_prompt=instruction, messages=self.arrange_message_for_model(online_input)) + self.verbose(instruction=instruction, online_input=online_input, model_response=model_response) + + criticism_elements = self.parse_elements(text=model_response, key_list=self.config.output) # key_list=self.config.output) + criticism_elements["input"] = online_input + + if self.config.others.debug or self.config.debug: + for k in self.config.output: + human_input = input(f"{k.upper()}: ") + if not human_input == "": + criticism_elements[k] = human_input + + return criticism_elements + +class Judge(Agent): + def __init__(self, config, objective, prompt_template): + super().__init__(config, objective, prompt_template) + self.instruction = None + self.actor_basic_info_dict = None + + self.output_play_path = os.path.join(CURRENT_DIR, f"play-{self.config.others.logname}.txt") if getattr(self.config.others, "logname", "") != "" else os.path.join(CURRENT_DIR, f"play.txt") + self.output_trash_path = os.path.join(CURRENT_DIR, f"trash-{self.config.others.logname}.txt") if getattr(self.config.others, "logname", "") != "" else os.path.join(CURRENT_DIR, f"trash.txt") + + def update_actor_basic_info(self, **actor_basic_info_dict): + self.actor_basic_info_dict = actor_basic_info_dict + + def get_judge_instruction(self): + if self.instruction: + return self.instruction + instruction = self.prompt_template["instruction_template"] + output_specifications = self.get_output_specifications() + instruction = instruction.replace("{output_specifications}", output_specifications) + instruction = instruction.replace("{planning_specifications}", self.actor_basic_info_dict["planning_specifications"]) + instruction = instruction.replace("{navigation_specifications}", self.actor_basic_info_dict["navigation_specifications"]) + self.instruction = instruction + return self.instruction + + def get_online_input(self, action_element_list): + input_template = self.prompt_template["input_template"] + input_prefix, input_suffix = input_template.split("{input}") + INPUT_TYPE_TO_CONTENT_MAP = { + "step": self.actor_basic_info_dict["step"], + "objective": self.objective, + "previous plans": self.actor_basic_info_dict["previous_plans"], + "interaction history": self.actor_basic_info_dict["interaction_history"], + "current observation": self.get_observation_text(), + "current visual observation": self.get_observation_image(), + "action choices": "\n\n".join(["|\taction [{}]:\n{}\n|\treason for action [{}]:\n{}".format(i, action_element["action"], i, action_element.get("reason", "N/A")) for i, action_element in enumerate(action_element_list)]) + } + input_list = [] + for input_type in self.config.input: + input_content = None + if input_type == "current visual observation": + continue + elif input_type in INPUT_TYPE_TO_CONTENT_MAP.keys(): + input_content = INPUT_TYPE_TO_CONTENT_MAP[input_type] + if input_content and isinstance(input_content, str): + input_list.append(("text", f"{input_type.upper()}:\n{input_content}\n")) + elif input_content and isinstance(input_content, list): + input_list.append(("text", f"{input_type.upper()}:\n")) + input_list += input_content if len(input_content) > 0 else ["N/A"] + + if "image" in self.config.current_observation.type: + input_type = "current visual observation" + input_list.append(("text", f"{input_type.upper()}:\n")) + input_list.append(("image", INPUT_TYPE_TO_CONTENT_MAP["current visual observation"])) + + return self.prune_message_list(message_list=[("text", input_prefix)] + input_list + [("text", input_suffix)]) + + def verbose(self, instruction, online_input, model_response): + VERBOSE_TO_CONTENT_MAP = { + "url": self.online_interaction["url"], + "objective": self.objective, + "instruction": instruction, + "online input": "\n".join([i[1] for i in online_input if i[0]=="text"]), + "response": model_response + } + if self.config.others.verbose > 0 and self.config.verbose > 0: + with open(self.output_trash_path, "a") as af: + af.write("-"*32+"JUDGE"+"-"*32+"\n") + for t in self.config.trash: + content = VERBOSE_TO_CONTENT_MAP[t] + with open(self.output_trash_path, "a") as af: + af.write(f"{t.upper()}:\n{content}\n\n") + + def flatten_action_element_list(self, action_element_list): + new_action_element_list = [] + for action_element in action_element_list: + if any("action candidates" in k for k in action_element.keys()): + action_candidates_key = [k for k in action_element.keys() if "action candidates" in k][0] + new_action_element = copy.deepcopy(action_element) + for action_reason_pair in action_element[action_candidates_key]: + new_action_element["action"] = action_reason_pair["action"] + new_action_element["reason"] = action_reason_pair["reason"] + new_action_element_list.append(copy.deepcopy(new_action_element)) + else: + new_action_element_list.append(action_element) + random.shuffle(new_action_element_list) + + return new_action_element_list + + def judge(self, action_element_list): + action_element_list = self.flatten_action_element_list(action_element_list) + if not self.config.mode or self.config.debug > 1: + return action_element_list[0], {} + if all(action_elements["action"]==action_element_list[0]["action"] for action_elements in action_element_list): + return action_element_list[0], {} + + def deduplicate_action_element_list_strict(lst): # deduplicate, remove action_elements with only note or stop command + seen = set() + note_list = [] + stop_list = [] + deduplicated_list = [] + + for i, item in enumerate(lst): + item = copy.deepcopy(item) + action_list = self.parse_str_to_action_list(item["action"], self.actor_basic_info_dict["planning_command"]+self.actor_basic_info_dict["navigation_command"]) + note_list.append([]) + none_note_stop_action_list = [] + for a in action_list: + if a.startswith("stop ["): + stop_list.append((a, i)) + elif a.startswith("note ["): + note_list[-1].append(a) + else: + none_note_stop_action_list.append(a) + item["action"] = "\n".join(none_note_stop_action_list) + if item["action"] and item["action"] not in seen: + seen.add(item["action"]) + deduplicated_list.append(item) + note_list = [("\n".join(notes), i) for i, notes in enumerate(note_list)] + return note_list, stop_list, deduplicated_list + + def deduplicate_action_element_list(lst): # deduplicate, remove action_elements with only note or stop command + seen = set() + deduplicated_list = [] + + for item in lst: + item = copy.deepcopy(item) + if item["action"] and item["action"] not in seen: + seen.add(item["action"]) + deduplicated_list.append(item) + return deduplicated_list + + if hasattr(self.config, "strict") and self.config.strict: + note_list, stop_list, deduplicated_action_element_list = deduplicate_action_element_list_strict(action_element_list) + if len(stop_list) >= 0.6 * len(action_element_list): + stop_action_choice = max([s[0] for s in stop_list], key=len) + stop_action_id = [s[1] for s in stop_list if s[0]==stop_action_choice][0] + return action_element_list[stop_action_id], {} + if not deduplicated_action_element_list: + note_action_choice = max([n[0] for n in note_list], key=len) + note_action_id = [n[1] for n in note_list if n[0]==note_action_choice][0] + action_elements = action_element_list[note_action_id] + action_elements["action"] = note_action_choice + return action_elements, {} + elif len(deduplicated_action_element_list) == 1: + action_elements = deduplicated_action_element_list[0] + note_action_choice = max([n[0] for n in note_list], key=len) + action_elements["action"] = note_action_choice + "\n" + action_elements["action"] + return action_elements, {} + else: + deduplicated_action_element_list = deduplicate_action_element_list(action_element_list) + + instruction = self.get_judge_instruction() + online_input = self.get_online_input(deduplicated_action_element_list) + model_response = self.call_model_with_message(system_prompt=instruction, messages=self.arrange_message_for_model(online_input)) + self.verbose(instruction=instruction, online_input=online_input, model_response=model_response) + + judgement_elements = self.parse_elements(text=model_response, key_list=self.config.output) # key_list=self.config.output) + judgement_elements["input"] = online_input + + if self.config.others.debug or self.config.debug: + for k in self.config.output: + human_input = input(f"{k.upper()}: ") + if not human_input == "": + judgement_elements[k] = human_input + + try: + action_selection = int(re.search(r'\d+', judgement_elements["action selection"]).group()) + selected_action_elements = deduplicated_action_element_list[action_selection] + if hasattr(self.config, "strict") and self.config.strict: + note_action_choice = max([n[0] for n in note_list], key=len) + if note_action_choice: + selected_action_elements["action"] = note_action_choice + "\n" + selected_action_elements["action"] + return selected_action_elements, judgement_elements + except: + return action_element_list[0], judgement_elements + +class AgentOccam: + def __init__(self, + config = None, + prompt_dict: Dict = None, + ): + self.config = config + self.prompt_dict = {} if prompt_dict is None else prompt_dict + + self.objective = None + self.online_observation = None + self.online_url = None + self.actor = None + self.critic = None + + self.trajectory = [] + + def get_refined_objective(self): + model_response = call_claude(self.root_prompt_template["objective_rephrasing_query"].replace("{objective}", self.objective)) + objective_match = re.search(r'REFINED OBJECTIVE:\s*(.*?)\s*(?=\n[A-Z]|$)', model_response, re.DOTALL) + self.objective_refined = objective_match.group(1) if objective_match else None + + def get_observation_text(self): + if isinstance(self.online_observation, dict): + return self.online_observation["text"] + else: + return self.online_observation + + def init_actor(self): + self.config.actor.others = self.config.others + if len(self.sites) > 1: + self.config.actor.navigation_command += ["go_home"] + self.actor = Actor( + config=self.config.actor, + objective=self.objective, + prompt_template=self.prompt_dict["actor"], + plan_tree_node=PlanTreeNode(id=0, type="branch", text=f"Find the solution to \"{self.objective}\"", level=0, url=self.online_url, step=0) + ) + with open(self.actor.output_trash_path, "w") as _: + pass + + def init_critic(self): + self.config.critic.others = self.config.others + self.critic = Critic( + config=self.config.critic, + objective=self.objective, + prompt_template=self.prompt_dict["critic"][self.config.critic.character], + ) + + def init_judge(self): + self.config.judge.others = self.config.others + self.judge = Judge( + config=self.config.judge, + objective=self.objective, + prompt_template=self.prompt_dict["judge"], + ) + + def predict_action(self): + self.critic.update_actor_basic_info(step=self.get_step(), planning_specifications=self.actor.get_planning_specifications(), navigation_specifications=self.actor.get_navigation_specifications(), interaction_history=self.actor.get_interaction_history(interaction_history_config=self.critic.config.interaction_history), previous_plans=self.actor.get_previous_plans(verbose=True)) + criticism_elements = self.critic.get_criticism_elements() if not self.get_step()==0 else {} + action_element_list = self.actor.predict_action(criticism_elements=criticism_elements) + self.judge.update_actor_basic_info(step=self.get_step(), planning_specifications=self.actor.get_planning_specifications(), navigation_specifications=self.actor.get_navigation_specifications(), interaction_history=self.actor.get_interaction_history(interaction_history_config=self.judge.config.interaction_history), previous_plans=self.actor.get_previous_plans(verbose=True), planning_command=self.actor.config.planning_command, navigation_command=self.actor.config.navigation_command) + selected_action_elements, judgement_elements = self.judge.judge(action_element_list) + selected_action_elements = self.actor.finalize_action(selected_action_elements) + return {**selected_action_elements, **{"critic:"+k: criticism_elements[k] for k in criticism_elements.keys()}, **{"judge:"+k: judgement_elements[k] for k in judgement_elements.keys()}}, action_element_list + + def update_online_state(self, url, observation): + self.online_url = url + self.online_observation = observation + + def get_step(self): + return self.actor.get_step() + + def is_navigation(self, action): + return self.actor.is_navigation(action=action) + + def get_actor_active_plan(self): + return self.actor.get_active_plan() + + def get_trajectory(self): + return self.trajectory + + def act(self, objective, env): + self.objective = objective + self.sites = env.get_sites() + observation = env.observation() + url = env.get_url() + self.update_online_state(url=url, observation=observation) + self.init_actor() + self.init_critic() + self.init_judge() + while not env.done(): + observation = env.observation() + url = env.get_url() + self.update_online_state(url=url, observation=observation) + self.actor.update_online_state(url=url, observation=observation) + self.critic.update_online_state(url=url, observation=observation) + self.judge.update_online_state(url=url, observation=observation) + action_elements, action_element_list = self.predict_action() + action = action_elements["action"] + navigation_action = action_elements["action"] if not action_elements.get("navigation action", "") else action_elements.get("navigation action", "") + status = env.step(navigation_action) + if navigation_action and self.is_navigation(action=navigation_action) and status == False: # means invalid action + flaw_node = self.actor.active_node + flaw_node.note.append(f"STEP {self.get_step()}: You generate action \"{action}\", which has INVALID syntax. Strictly follow the action specifications.") + DOCUMENTED_INTERACTION_ELEMENT_KEY_TO_CONTENT_MAP = { + "observation": observation, + "action": action, + "url": url, + "plan": self.get_actor_active_plan(), + "reason": action_elements.get("reason", ""), + "observation highlight": action_elements.get("observation highlight", ""), + "retained element ids": action_elements.get("retained element ids", []), + "observation summary": action_elements.get("observation description", "") + } + self.actor.update_history(**DOCUMENTED_INTERACTION_ELEMENT_KEY_TO_CONTENT_MAP) + self.actor.del_observation_node() + assert self.actor.equal_history_length() + + if len(action_element_list) > 1: + if self.config.others.logging: + self.log_step( + status=status if "status" in locals() and isinstance(status, dict) else env.status(), + plan=self.get_actor_active_plan(), + **action_elements, + **{f"actor {i}:{k}": _action_elements[k] for i, _action_elements in enumerate(action_element_list) for k in _action_elements.keys() if k != "input" and k != "instruction"} + ) + else: + if self.config.others.logging: + self.log_step( + status=status if "status" in locals() and isinstance(status, dict) else env.status(), + plan=self.get_actor_active_plan(), + **action_elements, + ) + + return status if "status" in locals() and isinstance(status, dict) else env.status() + + def log_step(self, status, **kwargs): + def serialize_message_list(message_list): + if not isinstance(message_list, list): + return message_list + return "".join([m[1] for m in message_list if m[0]=="text"]) + data_to_log = {} + data_to_log['objective'] = self.objective + data_to_log['url'] = self.online_url + data_to_log['observation'] = self.get_observation_text() + for (k, v) in status.items(): + data_to_log[k] = v + for k in kwargs.keys(): + try: + json.dumps(kwargs[k]) + data_to_log[k.replace(" ", "_")] = kwargs[k] if not "input" in k else serialize_message_list(kwargs[k]) + except: + pass + self.trajectory.append(data_to_log) \ No newline at end of file diff --git a/AgentOccam/__init__.py b/AgentOccam/__init__.py new file mode 100644 index 0000000..0911d44 --- /dev/null +++ b/AgentOccam/__init__.py @@ -0,0 +1,2 @@ +from .obs_opt import parse_node_descendants, parse_node_ancestors, parse_node_siblings, action_set_invisible, action_set_visible, action_set_visible_if_with_name, translate_node_to_str, construct_new_DOM_with_visible_nodes +from .utils import CURRENT_DIR, HOMEPAGE_URL \ No newline at end of file diff --git a/AgentOccam/configs/AgentOccam-Judge.yml b/AgentOccam/configs/AgentOccam-Judge.yml new file mode 100644 index 0000000..079abd3 --- /dev/null +++ b/AgentOccam/configs/AgentOccam-Judge.yml @@ -0,0 +1,78 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "AgentOccam-Judge" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "AgentOccam-Judge" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "previous plans", "interaction history", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["interaction history summary", "observation description", "action candidates", "observation highlight"] + planning_command: ["branch", "prune"] + navigation_command: ["click", "type", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: true + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: true + prune: true + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/AgentOccam-SteP.yml b/AgentOccam/configs/AgentOccam-SteP.yml new file mode 100644 index 0000000..badf923 --- /dev/null +++ b/AgentOccam/configs/AgentOccam-SteP.yml @@ -0,0 +1,26 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "AgentOccam-SteP" +max_steps: 20 +agent: + type: "AgentOccam-SteP" + root_action: "shopping_admin_agent" # Need to be adapted to tasks + low_level_action_list: ['click', 'type', 'stop', 'goto', 'hover', 'note', 'go_back'] + model_name: "gpt-4-turbo" + model_host: "openai" + prompt_mode: "chat" + max_target_len: 100 +env: + fullpage: true + prune: true + max_env_steps: 20 + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/AgentOccam-WebVoyager.yml b/AgentOccam/configs/AgentOccam-WebVoyager.yml new file mode 100644 index 0000000..d0583cf --- /dev/null +++ b/AgentOccam/configs/AgentOccam-WebVoyager.yml @@ -0,0 +1,74 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "AgentOccam-WebVoyager" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "AgentOccam-WebVoyager" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "previous plans", "interaction history", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["interaction history summary", "observation description", "reason", "action", "observation highlight"] + planning_command: ["branch", "prune"] + navigation_command: ["click", "type", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: true + prune: true + max_browser_rows: 500 + headless: True + relative_task_dir: "webvoyager" + task_ids: ["Allrecipes--3"] \ No newline at end of file diff --git a/AgentOccam/configs/AgentOccam.yml b/AgentOccam/configs/AgentOccam.yml new file mode 100644 index 0000000..77bf3fc --- /dev/null +++ b/AgentOccam/configs/AgentOccam.yml @@ -0,0 +1,78 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "AgentOccam" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "AgentOccam" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "previous plans", "interaction history", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["interaction history summary", "observation description", "reason", "action", "observation highlight"] + planning_command: ["branch", "prune"] + navigation_command: ["click", "type", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: true + prune: true + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/SteP-replication.yml b/AgentOccam/configs/SteP-replication.yml new file mode 100644 index 0000000..b3c33cf --- /dev/null +++ b/AgentOccam/configs/SteP-replication.yml @@ -0,0 +1,26 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "SteP-replication" +max_steps: 20 +agent: + type: "SteP-replication" + root_action: "shopping_admin_agent" # Need to be adapted to tasks + low_level_action_list: ['click', 'type', 'scroll', 'stop', 'goto', 'hover', 'note', 'go_back'] + model_name: "gpt-4-turbo" + model_host: "openai" + prompt_mode: "chat" + max_target_len: 100 +env: + fullpage: false + prune: false + max_env_steps: 20 + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/reduced_action-X_scrolling-obs_opt-history.yml b/AgentOccam/configs/reduced_action-X_scrolling-obs_opt-history.yml new file mode 100644 index 0000000..7cb45e8 --- /dev/null +++ b/AgentOccam/configs/reduced_action-X_scrolling-obs_opt-history.yml @@ -0,0 +1,78 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "reduced_action-X_scrolling-obs_opt-history" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "reduced_action-X_scrolling-obs_opt-history" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "interaction history", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["interaction history summary", "observation description", "reason", "action", "observation highlight"] + planning_command: [] + navigation_command: ["click", "type", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: true + prune: true + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/reduced_action-X_scrolling-obs_opt.yml b/AgentOccam/configs/reduced_action-X_scrolling-obs_opt.yml new file mode 100644 index 0000000..3c0cbf2 --- /dev/null +++ b/AgentOccam/configs/reduced_action-X_scrolling-obs_opt.yml @@ -0,0 +1,78 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "reduced_action-X_scrolling-obs_opt" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "reduced_action-X_scrolling-obs_opt" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["observation description", "reason", "action", "observation highlight"] + planning_command: [] + navigation_command: ["click", "type", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: true + prune: true + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/reduced_action-X_scrolling.yml b/AgentOccam/configs/reduced_action-X_scrolling.yml new file mode 100644 index 0000000..bc49bd7 --- /dev/null +++ b/AgentOccam/configs/reduced_action-X_scrolling.yml @@ -0,0 +1,78 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "reduced_action-X_scrolling" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "reduced_action-X_scrolling" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["observation description", "reason", "action", "observation highlight"] + planning_command: [] + navigation_command: ["click", "type", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: true + prune: false + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/configs/reduced_action.yml b/AgentOccam/configs/reduced_action.yml new file mode 100644 index 0000000..e2a1606 --- /dev/null +++ b/AgentOccam/configs/reduced_action.yml @@ -0,0 +1,78 @@ +logging: True +verbose: 1 +debug: False +logdir: "../AgentOccam-Trajectories" +logname: "reduced_action" +max_steps: 20 +agent: + type: "AgentOccam" + others: + max_steps: 20 + logname: "reduced_action" + logging: True + verbose: 1 + debug: False + actor: + debug: 0 + verbose: 1 + number: 1 + model: "gpt-4-turbo" + documented_interaction_elements: ["url", "plan", "reason", "observation summary", "retained element ids", "observation highlight"] + online_interaction_elements: [] + input: ["step", "objective", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: 3 + current_observation: + type: ["text"] + output: ["observation description", "reason", "action", "observation highlight"] + planning_command: [] + navigation_command: ["click", "type", "scroll", "stop", "note", "go_back"] + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response"] + critic: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + character: "normal" + input: ["objective", "previous plans", "interaction history", "step", "current observation"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["observation description", "mistakes"] + trash: ["instruction", "online input", "response"] + judge: + mode: false + debug: 0 + verbose: 1 + model: "gpt-4-turbo" + documented_interaction_elements: [] + online_interaction_elements: [] + strict: false + input: ["objective", "previous plans", "interaction history", "step", "current observation", "action choices"] + interaction_history: + verbose: True + type: ["text"] + step_num: "all" + current_observation: + type: ["text"] + output: ["plan progress assessment", "action assessment", "action selection"] + trash: ["instruction", "online input", "response"] +env: + fullpage: false + prune: false + max_browser_rows: 500 + headless: True + task_ids: ["stanford_cs_head", 65] + # a. "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790] + # b. "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767] + # c. "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798] + # d. "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735] + # e. "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] \ No newline at end of file diff --git a/AgentOccam/env.py b/AgentOccam/env.py new file mode 100644 index 0000000..7d27a49 --- /dev/null +++ b/AgentOccam/env.py @@ -0,0 +1,129 @@ +import json +from browser_env import ( + create_id_based_action, + create_id_based_actions, + StateInfo, + Trajectory, + ActionTypes, + ScriptBrowserEnv +) +from evaluation_harness.evaluators import evaluator_router +from AgentOccam.obs_opt import ( + prune_tree, + translate_node_to_str, +) + + +class WebArenaEnvironmentWrapper(): + def __init__(self, config_file, max_browser_rows=300, max_steps=50, slow_mo=1, observation_type="accessibility_tree", current_viewport_only=False, viewport_size={"width": 1280, "height": 720}, headless=False, global_config=None): + self.webarena_env = ScriptBrowserEnv( + headless=headless, + slow_mo=slow_mo, + observation_type=observation_type, + current_viewport_only=current_viewport_only, + viewport_size=viewport_size, + global_config=global_config + ) + self.config_file = config_file + with open(self.config_file, "r") as f: + self.config = json.load(f) + self.global_config = global_config + + self.obs, self.info = self.webarena_env.reset(options={"config_file": self.config_file}) + self.terminated = False + self.objective = self.config["intent"] + self.url = self.config["start_url"] + self.max_browser_rows = max_browser_rows + self.max_steps = max_steps + self.steps = 0 + self.is_done = False + self.reward = 0.0 + + self.trajectory: Trajectory = [] + self.update_webarena_metrics() + + def reset(self): + self.obs, self.info = self.webarena_env.reset(options={"config_file": self.config_file}) + + def close(self): + self.webarena_env.close() + + def get_url(self): + return self.url + + def get_objective(self): + return self.objective + + def get_sites(self): + return self.config["sites"] + + def observation(self): + self.url = self.webarena_env.page.url + if self.global_config and self.global_config.env.prune: + root_node = self.obs["text"][1] + DOM_root_node = prune_tree(objective=self.objective, root_node=root_node, mode="node") + DOM_str = translate_node_to_str(node=DOM_root_node, mode="concise") + return {"text": DOM_str, "image": self.obs["image"], "node": DOM_root_node} + else: + browser_content = self.obs["text"][0] + browser_content = browser_content.split("\n")[:self.max_browser_rows] + browser_content = "\n".join(browser_content) + return browser_content + + def done(self): + if self.is_done: + return True + return False + + def status(self): + return {'done': self.is_done, 'reward': self.reward, 'success': float(self.reward > 0), 'num_actions': self.steps} + + def step(self, action): + self.steps = self.steps + 1 + print(f"[Step {self.steps}] {action}") + print("*"*100) + if self.steps > self.max_steps: + print(f"Steps {self.steps} exceeded maximum {self.max_steps}") + self.is_done = True + action_cmd = create_id_based_action(f"stop [Trajectory failed: Steps {self.steps} exceeded maximum {self.max_steps}.]") + self.update_webarena_metrics(action_cmd) + return self.status() + + if action is None or action == "": + action_cmds = [] + else: + try: + action_cmds = create_id_based_actions(action) + if not action_cmds: + return False + except Exception as e: + print(f"Invalid action syntax: {e}") + action_cmds = [] + + for action_cmd in action_cmds: + try: + self.obs, _, self.terminated, _, self.info = self.webarena_env.step(action_cmd) + self.update_webarena_metrics(action_cmd) + except Exception as e: + print(f"Error occurred while taking step: {e}") + + return self.status() + + def update_webarena_metrics(self, action_cmd=None): + # Append action (if any) and resulting sate + if action_cmd: + self.trajectory.append(action_cmd) + if action_cmd["action_type"]== ActionTypes.STOP: + self.is_done = True + + if not self.is_done: # If we are done, no need to append state + state_info: StateInfo = {"observation": self.obs, "info": self.info} + self.trajectory.append(state_info) + + if self.is_done: + try: + evaluator = evaluator_router(self.config_file) + self.reward = evaluator(trajectory=self.trajectory, config_file=self.config_file, page=self.webarena_env.page, client=self.webarena_env.get_page_client(self.webarena_env.page)) + except Exception as e: + print(f"Got excepetion: {e}") + self.reward = 0 \ No newline at end of file diff --git a/AgentOccam/llms/claude.py b/AgentOccam/llms/claude.py new file mode 100644 index 0000000..346ae14 --- /dev/null +++ b/AgentOccam/llms/claude.py @@ -0,0 +1,213 @@ +import boto3 +import json +import numpy as np +from PIL import Image +import base64 +import io +import time + +DEFAULT_SYSTEM_PROMPT = '''You are an AI assistant. Your goal is to provide informative and substantive responses to queries.''' + +def call_claude(prompt, model_id="anthropic.claude-3-sonnet-20240229-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + native_request = { + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 1024, + "temperature": 0.95, + "system": system_prompt, + "messages": [ + { + "role": "user", + "content": [{"type": "text", "text": prompt}], + } + ], + } + + request = json.dumps(native_request) + + num_attempts = 0 + while True: + if num_attempts >= 10: + raise ValueError("OpenAI request failed.") + try: + response = client.invoke_model(modelId=model_id, body=request) + model_response = json.loads(response["body"].read()) + + response_text = model_response["content"][0]["text"] + return response_text + + except Exception as e: + print(e) + print("Sleeping for 10s...") + time.sleep(10) + num_attempts += 1 + + + +def arrange_message_for_claude(item_list): + def image_path_to_bytes(file_path): + with open(file_path, "rb") as image_file: + image_bytes = image_file.read() + return image_bytes + combined_item_list = [] + previous_item_is_text = False + text_buffer = "" + for item in item_list: + if item[0] == "image": + if len(text_buffer) > 0: + combined_item_list.append(("text", text_buffer)) + text_buffer = "" + combined_item_list.append(item) + previous_item_is_text = False + else: + if previous_item_is_text: + text_buffer += item[1] + else: + text_buffer = item[1] + previous_item_is_text = True + if item_list[-1][0] != "image" and len(text_buffer) > 0: + combined_item_list.append(("text", text_buffer)) + content = [] + for item in combined_item_list: + item_type = item[0] + if item_type == "text": + content.append({ + "type": "text", + "text": item[1] + }) + elif item_type == "image": + if isinstance(item[1], str): + media_type = "image/png" # "image/jpeg" + image_bytes = image_path_to_bytes(item[1]) + image_data = base64.b64encode(image_bytes).decode("utf-8") + elif isinstance(item[1], np.ndarray): + media_type = "image/jpeg" + image = Image.fromarray(item[1]).convert("RGB") + width, height = image.size + image = image.resize((int(0.5*width), int(0.5*height)), Image.LANCZOS) + image_bytes = io.BytesIO() + image.save(image_bytes, format='JPEG') + image_bytes = image_bytes.getvalue() + image_data = base64.b64encode(image_bytes).decode("utf-8") + content.append({ + "type": "image", + "source": { + "type": "base64", + "media_type": media_type, + "data": image_data, + }, + }) + messages = [ + { + "role": "user", + "content": content + } + ] + return messages + +def call_claude_with_messages(messages, model_id="anthropic.claude-3-sonnet-20240229-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + native_request = { + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 1024, + "temperature": 0.95, + "system": system_prompt, + "messages": messages, + } + + request = json.dumps(native_request) + + num_attempts = 0 + while True: + if num_attempts >= 10: + raise ValueError("OpenAI request failed.") + try: + response = client.invoke_model(modelId=model_id, body=request) + model_response = json.loads(response["body"].read()) + + response_text = model_response["content"][0]["text"] + return response_text + + except Exception as e: + print(e) + print("Sleeping for 10s...") + time.sleep(10) + num_attempts += 1 + + + +if __name__ == "__main__": + print(call_claude('''CURRENT OBSERVATION: +RootWebArea [2634] 'My Account' + link [3987] 'My Account' + link [3985] 'My Wish List' + link [3989] 'Sign Out' + text 'Welcome to One Stop Market' + link [3800] 'Skip to Content' + link [3809] 'store logo' + link [3996] 'My Cart' + combobox [4190] 'Search' [required: False] + link [4914] 'Advanced Search' + button [4193] 'Search' [disabled: True] + tablist [3699] + tabpanel + menu "[3394] 'Beauty & Personal Care'; [3459] 'Sports & Outdoors'; [3469] 'Clothing, Shoes & Jewelry'; [3483] 'Home & Kitchen'; [3520] 'Office Products'; [3528] 'Tools & Home Improvement'; [3533] 'Health & Household'; [3539] 'Patio, Lawn & Garden'; [3544] 'Electronics'; [3605] 'Cell Phones & Accessories'; [3620] 'Video Games'; [3633] 'Grocery & Gourmet Food'" + main + heading 'My Account' + text 'Contact Information' + text 'Emma Lopez' + text 'emma.lopezgmail.com' + link [3863] 'Change Password' + text 'Newsletters' + text "You aren't subscribed to our newsletter." + link [3877] 'Manage Addresses' + text 'Default Billing Address' + group [3885] + text 'Emma Lopez' + text '101 S San Mateo Dr' + text 'San Mateo, California, 94010' + text 'United States' + text 'T:' + link [3895] '6505551212' + text 'Default Shipping Address' + group [3902] + text 'Emma Lopez' + text '101 S San Mateo Dr' + text 'San Mateo, California, 94010' + text 'United States' + text 'T:' + link [3912] '6505551212' + link [3918] 'View All' + table 'Recent Orders' + row '| Order | Date | Ship To | Order Total | Status | Action |' + row '| --- | --- | --- | --- | --- | --- |' + row "| 000000170 | 5/17/23 | Emma Lopez | 365.42 | Canceled | View OrderReorder\tlink [4110] 'View Order'\tlink [4111] 'Reorder' |" + row "| 000000189 | 5/2/23 | Emma Lopez | 754.99 | Pending | View OrderReorder\tlink [4122] 'View Order'\tlink [4123] 'Reorder' |" + row "| 000000188 | 5/2/23 | Emma Lopez | 2,004.99 | Pending | View OrderReorder\tlink [4134] 'View Order'\tlink [4135] 'Reorder' |" + row "| 000000187 | 5/2/23 | Emma Lopez | 1,004.99 | Pending | View OrderReorder\tlink [4146] 'View Order'\tlink [4147] 'Reorder' |" + row "| 000000180 | 3/11/23 | Emma Lopez | 65.32 | Complete | View OrderReorder\tlink [4158] 'View Order'\tlink [4159] 'Reorder' |" + link [4165] 'My Orders' + link [4166] 'My Downloadable Products' + link [4167] 'My Wish List' + link [4169] 'Address Book' + link [4170] 'Account Information' + link [4171] 'Stored Payment Methods' + link [4173] 'My Product Reviews' + link [4174] 'Newsletter Subscriptions' + heading 'Compare Products' + text 'You have no items to compare.' + heading 'My Wish List' + text 'You have no items in your wish list.' + contentinfo + textbox [4177] 'Sign Up for Our Newsletter:' [required: False] + button [4072] 'Subscribe' + link [4073] 'Privacy and Cookie Policy' + link [4074] 'Search Terms' + link [4075] 'Advanced Search' + link [4076] 'Contact Us' + text 'Copyright 2013-present Magento, Inc. All rights reserved.' + text 'Help Us Keep Magento Healthy' + link [3984] 'Report All Bugs' +Today is 6/12/2023. Base on the webpage, tell me how many fulfilled orders I have over the past month, and the total amount of money I spent over the past month.''')) \ No newline at end of file diff --git a/AgentOccam/llms/cohere.py b/AgentOccam/llms/cohere.py new file mode 100644 index 0000000..184b832 --- /dev/null +++ b/AgentOccam/llms/cohere.py @@ -0,0 +1,42 @@ +import boto3 +import json +from botocore.exceptions import ClientError + +DEFAULT_SYSTEM_PROMPT = '''You are an AI assistant. Your goal is to provide informative and substantive responses to queries.''' + +def call_cohere(prompt, model_id="cohere.command-r-plus-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + formatted_prompt = f"{system_prompt}\n{prompt}" + + native_request = { + "message": formatted_prompt, + "max_tokens": 512, + "temperature": 0.5, + } + + request = json.dumps(native_request) + try: + response = client.invoke_model(modelId=model_id, body=request) + + except (ClientError, Exception) as e: + print(f"ERROR: Can't invoke '{model_id}'. Reason: {e}") + + model_response = json.loads(response["body"].read()) + + response_text = model_response["text"] + return response_text + +def arrange_message_for_cohere(item_list): + for item in item_list: + if item[0] == "image": + raise NotImplementedError() + prompt = "".join([item[1] for item in item_list]) + return prompt + +def call_cohere_with_messages(messages, model_id="cohere.command-r-plus-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + return call_cohere(prompt=messages, model_id=model_id, system_prompt=system_prompt) + +if __name__ == "__main__": + print(call_cohere('''Hi''')) + \ No newline at end of file diff --git a/AgentOccam/llms/gemini.py b/AgentOccam/llms/gemini.py new file mode 100644 index 0000000..5291a9c --- /dev/null +++ b/AgentOccam/llms/gemini.py @@ -0,0 +1,107 @@ +import google.generativeai as genai +import os +import time + +GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY", "") +genai.configure(api_key=GEMINI_API_KEY) + + +def call_gemini(prompt, model_id="gemini-1.5-flash", system_prompt=None): + model = genai.GenerativeModel(model_id) + + num_attempts = 0 + while True: + if num_attempts >= 10: + raise ValueError("Gemini request failed.") + try: + response = model.generate_content(system_prompt+"\n"+prompt) + response_text = response.text + return response_text + except Exception as e: + print(f"ERROR: Can't invoke '{model_id}'. Reason: {e}") + time.sleep(30) + + +def arrange_message_for_gemini(item_list): + for item in item_list: + if item[0] == "image": + raise NotImplementedError() + prompt = "".join([item[1] for item in item_list]) + return prompt + +def call_gemini_with_messages(messages, model_id="gemini-1.5-flash", system_prompt=None): + return call_gemini(prompt=messages, model_id=model_id, system_prompt=system_prompt) + +if __name__ == "__main__": + print(call_gemini('''CURRENT OBSERVATION: +RootWebArea [2634] 'My Account' + link [3987] 'My Account' + link [3985] 'My Wish List' + link [3989] 'Sign Out' + text 'Welcome to One Stop Market' + link [3800] 'Skip to Content' + link [3809] 'store logo' + link [3996] 'My Cart' + combobox [4190] 'Search' [required: False] + link [4914] 'Advanced Search' + button [4193] 'Search' [disabled: True] + tablist [3699] + tabpanel + menu "[3394] 'Beauty & Personal Care'; [3459] 'Sports & Outdoors'; [3469] 'Clothing, Shoes & Jewelry'; [3483] 'Home & Kitchen'; [3520] 'Office Products'; [3528] 'Tools & Home Improvement'; [3533] 'Health & Household'; [3539] 'Patio, Lawn & Garden'; [3544] 'Electronics'; [3605] 'Cell Phones & Accessories'; [3620] 'Video Games'; [3633] 'Grocery & Gourmet Food'" + main + heading 'My Account' + text 'Contact Information' + text 'Emma Lopez' + text 'emma.lopezgmail.com' + link [3863] 'Change Password' + text 'Newsletters' + text "You aren't subscribed to our newsletter." + link [3877] 'Manage Addresses' + text 'Default Billing Address' + group [3885] + text 'Emma Lopez' + text '101 S San Mateo Dr' + text 'San Mateo, California, 94010' + text 'United States' + text 'T:' + link [3895] '6505551212' + text 'Default Shipping Address' + group [3902] + text 'Emma Lopez' + text '101 S San Mateo Dr' + text 'San Mateo, California, 94010' + text 'United States' + text 'T:' + link [3912] '6505551212' + link [3918] 'View All' + table 'Recent Orders' + row '| Order | Date | Ship To | Order Total | Status | Action |' + row '| --- | --- | --- | --- | --- | --- |' + row "| 000000170 | 5/17/23 | Emma Lopez | 365.42 | Canceled | View OrderReorder\tlink [4110] 'View Order'\tlink [4111] 'Reorder' |" + row "| 000000189 | 5/2/23 | Emma Lopez | 754.99 | Pending | View OrderReorder\tlink [4122] 'View Order'\tlink [4123] 'Reorder' |" + row "| 000000188 | 5/2/23 | Emma Lopez | 2,004.99 | Pending | View OrderReorder\tlink [4134] 'View Order'\tlink [4135] 'Reorder' |" + row "| 000000187 | 5/2/23 | Emma Lopez | 1,004.99 | Pending | View OrderReorder\tlink [4146] 'View Order'\tlink [4147] 'Reorder' |" + row "| 000000180 | 3/11/23 | Emma Lopez | 65.32 | Complete | View OrderReorder\tlink [4158] 'View Order'\tlink [4159] 'Reorder' |" + link [4165] 'My Orders' + link [4166] 'My Downloadable Products' + link [4167] 'My Wish List' + link [4169] 'Address Book' + link [4170] 'Account Information' + link [4171] 'Stored Payment Methods' + link [4173] 'My Product Reviews' + link [4174] 'Newsletter Subscriptions' + heading 'Compare Products' + text 'You have no items to compare.' + heading 'My Wish List' + text 'You have no items in your wish list.' + contentinfo + textbox [4177] 'Sign Up for Our Newsletter:' [required: False] + button [4072] 'Subscribe' + link [4073] 'Privacy and Cookie Policy' + link [4074] 'Search Terms' + link [4075] 'Advanced Search' + link [4076] 'Contact Us' + text 'Copyright 2013-present Magento, Inc. All rights reserved.' + text 'Help Us Keep Magento Healthy' + link [3984] 'Report All Bugs' +Today is 6/12/2023. Base on the aforementioned webpage, tell me how many fulfilled orders I have over the past month, and the total amount of money I spent over the past month.''')) \ No newline at end of file diff --git a/AgentOccam/llms/gpt.py b/AgentOccam/llms/gpt.py new file mode 100644 index 0000000..c3ab2ec --- /dev/null +++ b/AgentOccam/llms/gpt.py @@ -0,0 +1,222 @@ +import openai +from openai import OpenAI, AzureOpenAI +import time +import numpy as np +from PIL import Image +import base64 +import io +import requests +import os +OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", None) +AZURE_ENDPOINT = os.environ.get("AZURE_ENDPOINT", None) +headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {OPENAI_API_KEY}" +} +DEFAULT_SYSTEM_PROMPT = "You are a helpful assistant." + +def call_gpt(prompt, model_id="gpt-3.5-turbo", system_prompt=DEFAULT_SYSTEM_PROMPT): + num_attempts = 0 + while True: + if num_attempts >= 10: + raise ValueError("OpenAI request failed.") + try: + response = OpenAI().chat.completions.create( + model=model_id, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": prompt}, + ], + temperature=0.95, + top_p=0.95, + frequency_penalty=0, + presence_penalty=0, + stop=None + ) + + return response.choices[0].message.content.strip() + except openai.AuthenticationError as e: + print(e) + return None + except openai.RateLimitError as e: + print(e) + print("Sleeping for 10s...") + time.sleep(10) + num_attempts += 1 + except Exception as e: + print(e) + print("Sleeping for 10s...") + time.sleep(10) + num_attempts += 1 + +def arrange_message_for_gpt(item_list): + def image_path_to_bytes(file_path): + with open(file_path, "rb") as image_file: + image_bytes = image_file.read() + return image_bytes + combined_item_list = [] + previous_item_is_text = False + text_buffer = "" + for item in item_list: + if item[0] == "image": + if len(text_buffer) > 0: + combined_item_list.append(("text", text_buffer)) + text_buffer = "" + combined_item_list.append(item) + previous_item_is_text = False + else: + if previous_item_is_text: + text_buffer += item[1] + else: + text_buffer = item[1] + previous_item_is_text = True + if item_list[-1][0] != "image" and len(text_buffer) > 0: + combined_item_list.append(("text", text_buffer)) + content = [] + for item in combined_item_list: + item_type = item[0] + if item_type == "text": + content.append({ + "type": "text", + "text": item[1] + }) + elif item_type == "image": + if isinstance(item[1], str): + image_bytes = image_path_to_bytes(item[1]) + image_data = base64.b64encode(image_bytes).decode("utf-8") + elif isinstance(item[1], np.ndarray): + image = Image.fromarray(item[1]).convert("RGB") + width, height = image.size + image = image.resize((int(0.5*width), int(0.5*height)), Image.LANCZOS) + image_bytes = io.BytesIO() + image.save(image_bytes, format='JPEG') + image_bytes = image_bytes.getvalue() + image_data = base64.b64encode(image_bytes).decode("utf-8") + content.append({ + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{image_data}" + }, + }) + messages = [ + { + "role": "user", + "content": content + } + ] + return messages + +def call_gpt_with_messages(messages, model_id="gpt-3.5-turbo", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = OpenAI() if not AZURE_ENDPOINT else AzureOpenAI(azure_endpoint = AZURE_ENDPOINT, api_key=OPENAI_API_KEY, api_version="2024-02-15-preview") + num_attempts = 0 + while True: + if num_attempts >= 10: + raise ValueError("OpenAI request failed.") + try: + if any("image" in c["type"] for m in messages for c in m["content"]): + payload = { + "model": "gpt-4-turbo", + "messages": messages, + } + + response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload) + return response.json()["choices"][0]["message"].get("content", "").strip() + else: + response = client.chat.completions.create( + model=model_id, + messages=messages if messages[0]["role"] == "system" else [{"role": "system", "content": system_prompt}] + messages, + temperature=0.5, + top_p=0.95, + frequency_penalty=0, + presence_penalty=0, + stop=None + ) + return response.choices[0].message.content.strip() + except openai.AuthenticationError as e: + print(e) + return None + except openai.RateLimitError as e: + print(e) + print("Sleeping for 10s...") + time.sleep(10) + num_attempts += 1 + except Exception as e: + print(e) + print("Sleeping for 10s...") + time.sleep(10) + num_attempts += 1 + +if __name__ == "__main__": + prompt = '''CURRENT OBSERVATION: +RootWebArea [2634] 'My Account' + link [3987] 'My Account' + link [3985] 'My Wish List' + link [3989] 'Sign Out' + text 'Welcome to One Stop Market' + link [3800] 'Skip to Content' + link [3809] 'store logo' + link [3996] 'My Cart' + combobox [4190] 'Search' [required: False] + link [4914] 'Advanced Search' + button [4193] 'Search' [disabled: True] + tablist [3699] + tabpanel + menu "[3394] 'Beauty & Personal Care'; [3459] 'Sports & Outdoors'; [3469] 'Clothing, Shoes & Jewelry'; [3483] 'Home & Kitchen'; [3520] 'Office Products'; [3528] 'Tools & Home Improvement'; [3533] 'Health & Household'; [3539] 'Patio, Lawn & Garden'; [3544] 'Electronics'; [3605] 'Cell Phones & Accessories'; [3620] 'Video Games'; [3633] 'Grocery & Gourmet Food'" + main + heading 'My Account' + text 'Contact Information' + text 'Emma Lopez' + text 'emma.lopezgmail.com' + link [3863] 'Change Password' + text 'Newsletters' + text "You aren't subscribed to our newsletter." + link [3877] 'Manage Addresses' + text 'Default Billing Address' + group [3885] + text 'Emma Lopez' + text '101 S San Mateo Dr' + text 'San Mateo, California, 94010' + text 'United States' + text 'T:' + link [3895] '6505551212' + text 'Default Shipping Address' + group [3902] + text 'Emma Lopez' + text '101 S San Mateo Dr' + text 'San Mateo, California, 94010' + text 'United States' + text 'T:' + link [3912] '6505551212' + link [3918] 'View All' + table 'Recent Orders' + row '| Order | Date | Ship To | Order Total | Status | Action |' + row '| --- | --- | --- | --- | --- | --- |' + row "| 000000170 | 5/17/23 | Emma Lopez | 365.42 | Canceled | View OrderReorder\tlink [4110] 'View Order'\tlink [4111] 'Reorder' |" + row "| 000000189 | 5/2/23 | Emma Lopez | 754.99 | Pending | View OrderReorder\tlink [4122] 'View Order'\tlink [4123] 'Reorder' |" + row "| 000000188 | 5/2/23 | Emma Lopez | 2,004.99 | Pending | View OrderReorder\tlink [4134] 'View Order'\tlink [4135] 'Reorder' |" + row "| 000000187 | 5/2/23 | Emma Lopez | 1,004.99 | Pending | View OrderReorder\tlink [4146] 'View Order'\tlink [4147] 'Reorder' |" + row "| 000000180 | 3/11/23 | Emma Lopez | 65.32 | Complete | View OrderReorder\tlink [4158] 'View Order'\tlink [4159] 'Reorder' |" + link [4165] 'My Orders' + link [4166] 'My Downloadable Products' + link [4167] 'My Wish List' + link [4169] 'Address Book' + link [4170] 'Account Information' + link [4171] 'Stored Payment Methods' + link [4173] 'My Product Reviews' + link [4174] 'Newsletter Subscriptions' + heading 'Compare Products' + text 'You have no items to compare.' + heading 'My Wish List' + text 'You have no items in your wish list.' + contentinfo + textbox [4177] 'Sign Up for Our Newsletter:' [required: False] + button [4072] 'Subscribe' + link [4073] 'Privacy and Cookie Policy' + link [4074] 'Search Terms' + link [4075] 'Advanced Search' + link [4076] 'Contact Us' + text 'Copyright 2013-present Magento, Inc. All rights reserved.' + text 'Help Us Keep Magento Healthy' + link [3984] 'Report All Bugs' +Today is 6/12/2023. Base on the aforementioned webpage, tell me how many fulfilled orders I have over the past month, and the total amount of money I spent over the past month.''' + print(call_gpt(prompt=prompt, model_id="gpt-4-turbo")) \ No newline at end of file diff --git a/AgentOccam/llms/llama.py b/AgentOccam/llms/llama.py new file mode 100644 index 0000000..3fa164f --- /dev/null +++ b/AgentOccam/llms/llama.py @@ -0,0 +1,41 @@ +import boto3 +import json + +DEFAULT_SYSTEM_PROMPT = '''You are an AI assistant. Your goal is to provide informative and substantive responses to queries.''' + +def call_llama(prompt, model_id = "meta.llama3-8b-instruct-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + formatted_prompt = f'''\n<|begin_of_text|>\n<|start_header_id|>user<|end_header_id|>\n{system_prompt}\n{prompt}\n<|eot_id|>\n<|start_header_id|>assistant<|end_header_id|>\n''' + + native_request = { + "prompt": formatted_prompt, + "max_gen_len": 512, + "temperature": 0.5, + } + + request = json.dumps(native_request) + + try: + response = client.invoke_model(modelId=model_id, body=request) + + except Exception as e: + raise KeyError(f"ERROR: Can't invoke '{model_id}'. Reason: {e}") + + model_response = json.loads(response["body"].read()) + + response_text = model_response["generation"] + return response_text + +def arrange_message_for_llama(item_list): + for item in item_list: + if item[0] == "image": + raise NotImplementedError() + prompt = "".join([item[1] for item in item_list]) + return prompt + +def call_llama_with_messages(messages, model_id="meta.llama3-8b-instruct-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + return call_llama(prompt=messages, model_id=model_id, system_prompt=system_prompt) + +if __name__ == "__main__": + print(call_llama('''Hi''')) \ No newline at end of file diff --git a/AgentOccam/llms/mistral.py b/AgentOccam/llms/mistral.py new file mode 100644 index 0000000..e778cf9 --- /dev/null +++ b/AgentOccam/llms/mistral.py @@ -0,0 +1,42 @@ +import boto3 +import json +from botocore.exceptions import ClientError + +DEFAULT_SYSTEM_PROMPT = '''You are an AI assistant. Your goal is to provide informative and substantive responses to queries.''' + +def call_mistral(prompt, model_id="mistral.mistral-large-2402-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + formatted_prompt = f"[INST] {system_prompt}\n{prompt} [/INST]" + + native_request = { + "prompt": formatted_prompt, + "max_tokens": 512, + "temperature": 0.5, + } + + request = json.dumps(native_request) + try: + response = client.invoke_model(modelId=model_id, body=request) + + except (ClientError, Exception) as e: + print(f"ERROR: Can't invoke '{model_id}'. Reason: {e}") + + model_response = json.loads(response["body"].read()) + + response_text = model_response["outputs"][0]["text"] + return response_text + +def arrange_message_for_mistral(item_list): + for item in item_list: + if item[0] == "image": + raise NotImplementedError() + prompt = "".join([item[1] for item in item_list]) + return prompt + +def call_mistral_with_messages(messages, model_id="mistral.mistral-large-2402-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + return call_mistral(prompt=messages, model_id=model_id, system_prompt=system_prompt) + +if __name__ == "__main__": + print(call_mistral('''Hi''')) + \ No newline at end of file diff --git a/AgentOccam/llms/titan.py b/AgentOccam/llms/titan.py new file mode 100644 index 0000000..13bd82e --- /dev/null +++ b/AgentOccam/llms/titan.py @@ -0,0 +1,44 @@ +import boto3 +import json +from botocore.exceptions import ClientError + +DEFAULT_SYSTEM_PROMPT = '''You are an AI assistant. Your goal is to provide informative and substantive responses to queries.''' + +def call_titan(prompt, model_id="amazon.titan-text-premier-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + formatted_prompt = f"{system_prompt}\n{prompt}" + + native_request = { + "inputText": formatted_prompt, + "textGenerationConfig": { + "maxTokenCount": 512, + "temperature": 0.5, + }, + } + + request = json.dumps(native_request) + try: + response = client.invoke_model(modelId=model_id, body=request) + + except (ClientError, Exception) as e: + print(f"ERROR: Can't invoke '{model_id}'. Reason: {e}") + + model_response = json.loads(response["body"].read()) + + response_text = model_response["results"][0]["outputText"] + return response_text + +def arrange_message_for_titan(item_list): + for item in item_list: + if item[0] == "image": + raise NotImplementedError() + prompt = "".join([item[1] for item in item_list]) + return prompt + +def call_titan_with_messages(messages, model_id="amazon.titan-text-premier-v1:0", system_prompt=DEFAULT_SYSTEM_PROMPT): + return call_titan(prompt=messages, model_id=model_id, system_prompt=system_prompt) + +if __name__ == "__main__": + print(call_titan('''Hi''')) + \ No newline at end of file diff --git a/AgentOccam/obs_opt.py b/AgentOccam/obs_opt.py new file mode 100644 index 0000000..6fa7b56 --- /dev/null +++ b/AgentOccam/obs_opt.py @@ -0,0 +1,410 @@ +import re +from browser_env.processors import TreeNode +from functools import partial + +RETAINED_PROPERTIES = ["required", "disabled", "checked", "valuemin", "valuemax", "valuetext", "selected", "page_dialog_message"] +UNWANTED_PROPERTIES = ["focused", "autocomplete", "hasPopup", "expanded", "multiselectable", "orientation", "controls"] +UNINTERACTIVE_ROLES = ["StaticText", "LabelText", "main", "heading", "LayoutTable", "tabpanel", "LayoutTableRow", "LayoutTableCell", "time", "list", "contentinfo", "table", "row", "rowheader", "columnheader", "gridcell", "caption", "DescriptionList", "DescriptionListTerm", "DescriptionListDetail", "RootWebArea", "rowgroup", "alert"] +ROLE_REPLACEMENT_DICT = { + "StaticText": "text", + "LabelText": "text", + # "caption": "text", + # "generic": "text" +} + +def parse_text_to_tree(text): + lines = text.split('\n') + + root = None + parent_stack = {} + + for line in lines: + if line.strip() == "": + continue + line_strip = line.strip() + line_parts = line_strip.split(' ') + id = line_parts[0][1:-1] + type = line_parts[1] + text = ' '.join(line_parts[2:]) + level = 0 + for char in line: + if char == '\t': + level += 1 + else: + break + + node = TreeNode(id, type, text, level) + + if line.startswith('\t'): + parent_stack[level].add_child(node) + else: + root = node + + parent_stack[level+1] = node + + return root + +def remove_unwanted_characters(text): + text = text.replace('\xa0', ' ') + cleaned_text = re.sub(r'[^\w\s,.!?;:\-\'\"()&/\u2019@]+', '', text, flags=re.UNICODE) + cleaned_text = re.sub(r'\s+', ' ', cleaned_text) + return cleaned_text.strip() + +def search_node_by_id(node, target_id): + if node.node_id == target_id: + return node + for child in node.children: + result = search_node_by_id(child, target_id) + if result: + return result + return None + +def action_replace_node_role(node:TreeNode, role_replacement_dict:dict): + if node.role in role_replacement_dict.keys(): + node.role = role_replacement_dict[node.role] + +def action_remove_unwanted_characters(node:TreeNode): + node.name = remove_unwanted_characters(node.name) + +def action_remove_unwanted_properties(node:TreeNode): + if node.has_properties(): + node.properties = {p: node.properties[p] for p in node.properties.keys() if p not in UNWANTED_PROPERTIES} + if node.parent and node.parent.role=="row" and not node.properties["required"]: + del node.properties["required"] + if len(node.properties) == 0: + node.properties = None + +def action_remove_redundant_statictext_node(node:TreeNode): + if not node.visible: + return + if not (node.all_children_invisible() and node.role in ["StaticText", "LabelText", "caption"]): + return + if (not node.name) or (node.parent and node.name in node.parent.name) or (node.parent and any(node.name in sibling.name for sibling in node.siblings())): + node.visible = False + +def action_merge_statictext_to_parent(node:TreeNode): + if not node.visible: + return + if not (node.all_children_invisible() and node.role in ["StaticText", "LabelText", "caption"]): + return + if node.parent and not node.parent.name and len(node.parent.children) == 1: + node.parent.name = node.name + node.visible = False + +def action_merge_menuitem_and_option(node:TreeNode): + if not node.visible: + return + if not ((node.visible_children() and all(c.role=="menuitem" for c in node.visible_children())) or (node.visible_children() and all(c.role=="option" for c in node.visible_children()))): + return + if node.visible_children()[0].role == "menuitem": + if not node.name.strip(): + node.name = "; ".join([action_return_visible_node(c).strip()[len("menuitem "):] for c in node.visible_children()]) + else: + node.name += ": " + "; ".join([action_return_visible_node(c).strip()[len("menuitem "):] for c in node.visible_children()]) + elif node.visible_children()[0].role == "option": + if not node.name.strip(): + node.name = "; ".join([action_return_visible_node(c).strip()[len("option "):] for c in node.visible_children()]) + else: + node.name += ": " + "; ".join([action_return_visible_node(c).strip()[len("option "):] for c in node.visible_children()]) + for c in node.visible_children(): + c.visible = False + +def action_merge_description_list(node:TreeNode): + if not node.visible: + return + def reformat_sublist(current_list_term_buffer): + if len(current_list_term_buffer) > 1: + list_term_node_appended_name = [] + for n in current_list_term_buffer[1:]: + list_term_node_appended_name.append(n.name) + n.visible = False + current_list_term_buffer[0].name += ": " + "; ".join(list_term_node_appended_name) + + if not node.role == "DescriptionList": + return + for child in node.visible_children(): + if child.role == "DescriptionListDetail" and not child.name and len(child.visible_children()) == 1: + child.name = action_return_visible_node(child.visible_children()[0]).strip() + child.visible_children()[0].visible = False + list_term_buffer = [] + for child in node.visible_children(): + if child.role == "DescriptionListTerm" and child.all_children_invisible(): + reformat_sublist(current_list_term_buffer=list_term_buffer) + list_term_buffer = [child] + elif child.role == "DescriptionListDetail" and child.all_children_invisible() and list_term_buffer: + list_term_buffer.append(child) + elif child.role == "DescriptionListDetail" and not child.all_children_invisible(): + list_term_buffer = [] + else: + reformat_sublist(current_list_term_buffer=list_term_buffer) + list_term_buffer = [] + reformat_sublist(current_list_term_buffer=list_term_buffer) + +def action_remove_image(node:TreeNode): + if not node.visible: + return + if node.all_children_invisible() and (node.role=="img" or node.name=="Image"): + node.visible = False + +def action_set_invisible(node:TreeNode): + node.visible = False + +def action_set_visible(node:TreeNode): + node.visible = True + +def action_set_visible_if_with_name(node:TreeNode): + if node.name: + node.visible = True + +def action_reformat_table(node:TreeNode): + if not node.visible: + return + def merge_gridcell(gridcell_node:TreeNode): + if gridcell_node.role not in ["gridcell", "columnheader", "rowheader", "LayoutTableCell"] or not gridcell_node.visible: + return + gridcell_buffer = [] + parse_node_descendants(gridcell_node, action_return_visible_node, gridcell_buffer) + if len(gridcell_buffer) == 1: + return + gridcell_buffer = [s.strip() for s in gridcell_buffer] + if gridcell_node.name: + gridcell_node.name += "\t" + "\t".join(gridcell_buffer[1:]) + else: + gridcell_node.name = "\t".join(gridcell_buffer[1:]) + parse_node_descendants(gridcell_node, action_set_invisible) + gridcell_node.visible = True + + try: + if node.role == "table": + + def reformat_subtable(row_list, current_table_children): + import copy + new_table_children = copy.deepcopy(current_table_children) + if row_list: + # if row_list[0].children[0].role == "columnheader": + if any(row_0_child.role == "columnheader" for row_0_child in row_list[0].children): + if new_table_children and any(n.visible for n in new_table_children): + new_table_children.append(TreeNode(node_id=row_list[0].node_id, role="row", name="", depth=row_list[0].depth)) + for i, row in enumerate(row_list): + new_role_name = [] + for row_element in row.children: + new_role_name.append(row_element.name) + new_table_children.append(TreeNode(node_id=row.node_id, role="row", name="| "+" | ".join(new_role_name)+" |", depth=row.depth)) + if i == 0 and len(row_list) > 1: + new_table_children.append(TreeNode(node_id=row.node_id, role="row", name="| "+" | ".join(["---"]*len(new_role_name))+" |", depth=row.depth)) + elif row_list[0].children[0].role == "rowheader": + if new_table_children and any(n.visible for n in new_table_children): + new_table_children.append(TreeNode(node_id=row_list[0].node_id, role="row", name="", depth=row_list[0].depth)) + titles = [r.children[0].name for r in row_list] + values = [r.children[1].name for r in row_list] + new_table_children.append(TreeNode(node_id=row_list[0].node_id, role="row", name="| "+" | ".join(titles)+" |", depth=row_list[0].depth)) + new_table_children.append(TreeNode(node_id=row_list[0].node_id, role="row", name="| "+" | ".join(["---"]*len(titles))+" |", depth=row_list[0].depth)) + new_table_children.append(TreeNode(node_id=row_list[0].node_id, role="row", name="| "+" | ".join(values)+" |", depth=row_list[0].depth)) + elif row_list[0].children[0].role == "gridcell": + if new_table_children and any(n.visible for n in new_table_children): + new_table_children.append(TreeNode(node_id=row_list[0].node_id, role="row", name="", depth=row_list[0].depth)) + for row in row_list: + new_table_children.append(TreeNode(node_id=row.node_id, role="row", name="| "+" | ".join([row_element.name for row_element in row.children])+" |", depth=row.depth)) + else: + raise NotImplementedError("Unrecognized table format.") + return new_table_children + + new_table_children = [] + row_list = [] + row_mode = False + for child in node.children: + if child.role == "row": + for row_element in child.visible_children(): # TODO: Visible? + merge_gridcell(row_element) + + # if child.role == "row" and child.children[0].role == "columnheader": + if child.role == "row" and any(row_child.role == "columnheader" for row_child in child.children): + row_list = [child] + row_mode = False + elif child.role == "row" and child.children[0].role == "rowheader": + if row_mode: + row_list.append(child) + else: + new_table_children = reformat_subtable(row_list=row_list, current_table_children=new_table_children) + row_list = [child] + row_mode = True + elif child.role == "row" and child.children[0].role == "gridcell": + row_list.append(child) + row_mode = False + elif child.role != "row": + new_table_children = reformat_subtable(row_list=row_list, current_table_children=new_table_children) + if child.role == "rowgroup": + for grandchild in child.visible_children(): # grandchild: row + for row_element in grandchild.visible_children(): # TODO: Visible? + merge_gridcell(row_element) + child.children = reformat_subtable(row_list=child.children, current_table_children=[]) + new_table_children.append(child) + row_list = [] + else: + raise NotImplementedError() + new_table_children = reformat_subtable(row_list=row_list, current_table_children=new_table_children) + node.children = new_table_children + elif node.role == "LayoutTable": + def merge_adjacent_text_nodes(nodes): + if not nodes: + return [] + + merged_nodes = [] + current_node = nodes[0] + + for i in range(1, len(nodes)): + if current_node.visible and current_node.role in ["LayoutTableCell", "StaticText", "generic"]+list(set(ROLE_REPLACEMENT_DICT.values())) and nodes[i].visible and nodes[i].role in ["LayoutTableCell", "StaticText", "generic"]+list(set(ROLE_REPLACEMENT_DICT.values())): + current_node.role = ROLE_REPLACEMENT_DICT["StaticText"] + current_node.name += " " + nodes[i].name # Merge text values + nodes[i].visible = False + else: + merged_nodes.append(current_node) + current_node = nodes[i] + + merged_nodes.append(current_node) + + return merged_nodes + def dfs_merge_text(n:TreeNode): + if not n.children: + return + for c in n.children: + dfs_merge_text(c) + n.children = merge_adjacent_text_nodes(n.children) + if len(n.visible_children()) == 1 and n.visible_children()[0].role in ["LayoutTableCell", "StaticText", "generic"]+list(set(ROLE_REPLACEMENT_DICT.values())) and n.role in ["LayoutTableCell", "StaticText", "generic"]+list(set(ROLE_REPLACEMENT_DICT.values())): + n.name += "\t" + n.visible_children()[0].name + n.visible_children()[0].visible = False + if n.role == "LayoutTableRow": + for row_element in n.children: + if row_element.visible and row_element.children: + for sub_element in row_element.children: + if sub_element.visible: + node_str = action_return_visible_node(sub_element).strip() + row_element.name += f"\t{node_str}" + row_element.children = [] + n.name = "| " + " | ".join([c.name for c in n.children if c.visible]) + " |" # TODO: Visible? + for row_element in n.children: + row_element.visible = False + dfs_merge_text(node) + except Exception as e: + print("Table reformatting error:", e) + +def action_merge_duplicated_headings(node:TreeNode): + if not node.visible or not node.all_children_invisible() or not node.parent or node.visible_siblings(): + return + if node.role=="heading" and node.parent.role not in UNINTERACTIVE_ROLES and node.name == node.parent.name: + node.visible = False + if node.parent.role=="heading" and node.role not in UNINTERACTIVE_ROLES and node.name == node.parent.name: + node.parent.node_id = node.node_id + node.parent.role = node.role + node.parent.properties = node.properties + node.parent.children = node.children + node.visible = False + +def action_print_tree(node:TreeNode): + print("\t" * node.depth + f"{node.visible} {node.depth} [{node.node_id}] {node.role}: {node.name}") + +def action_return_visible_node(node:TreeNode, intent_bias=0, mode="concise", **kwargs): + if not node.visible: + return None + if mode == "concise": + node_str = node.role + hidden_roles = UNINTERACTIVE_ROLES+list(set(ROLE_REPLACEMENT_DICT.values())) + if "[" in node.name and "hidden_roles" in kwargs.keys(): + hidden_roles += kwargs["hidden_roles"] + if node.role not in hidden_roles: + node_str += f" [{node.node_id}]" + elif mode == "verbose": + node_str = f"{node.role} [{node.node_id}]" + elif mode == "name_only": + node_str = node.role + elif mode == "name_retained_id_only": + node_str = node.role + retained_ids = kwargs.get("retained_ids", []) + if node.node_id in retained_ids: + node_str += f" [{node.node_id}]" + + if node.name: + node_str += f" {repr(node.name)}" + if node.has_properties(): + for p in node.properties: + p_value = node.properties[p] + node_str += f" [{p}: {p_value}]" + return "\t" * (node.depth-intent_bias) + node_str + +def parse_node_siblings(node:TreeNode, action=action_print_tree, tree_buffer=[]): + for sibling in node.siblings(): + res_action = action(sibling) + if res_action: + tree_buffer.append(res_action) + +def parse_node_ancestors(node:TreeNode, action=action_print_tree, tree_buffer=[]): + res_action = action(node) + if res_action: + tree_buffer.append(res_action) + if node.parent: + parse_node_ancestors(node=node.parent, action=action, tree_buffer=tree_buffer) + +def parse_node_descendants(node:TreeNode, action=action_print_tree, tree_buffer=[]): + res_action = action(node) + if res_action: + tree_buffer.append(res_action) + for child in node.children: + parse_node_descendants(node=child, action=action, tree_buffer=tree_buffer) + +def prune_tree_fuzzy_node(node:TreeNode): # TODO: Bugs!!! + if not node.children: + return + + # Iterate over the children in reverse order to safely remove nodes + fuzzy_children = [] + for child in reversed(node.children): + prune_tree_fuzzy_node(child) + if child.all_children_invisible() and not child.is_differentiable(strict=True): + fuzzy_children.append(child) + for child in fuzzy_children: + child.visible = False + +def translate_node_to_str(node: TreeNode, mode="concise", **kwargs): + tree_buffer = [] + parse_node_descendants(node, partial(action_return_visible_node, intent_bias=node.depth, mode=mode, **kwargs), tree_buffer=tree_buffer) + return "\n".join(tree_buffer[:1000]) + +def construct_new_DOM_with_visible_nodes(DOM_root:TreeNode): + def dfs(node:TreeNode): + if not node.visible: + return None + if not node.visible_children(): + return node.copy() + new_self = node.copy() + for child in node.visible_children(): + new_child = dfs(child) + if new_child: + new_self.add_child(new_child) + return new_self + new_DOM_Root = dfs(DOM_root) + return new_DOM_Root + +def prune_tree(objective, root_node, mode="str"): + root_node_copy = construct_new_DOM_with_visible_nodes(root_node) + parse_node_descendants(root_node_copy, action_remove_unwanted_characters) + parse_node_descendants(root_node_copy, action_remove_unwanted_properties) + parse_node_descendants(root_node_copy, action_remove_redundant_statictext_node) + parse_node_descendants(root_node_copy, action_remove_image) + prune_tree_fuzzy_node(root_node_copy) + parse_node_descendants(root_node_copy, action_remove_image) + parse_node_descendants(root_node_copy, action_merge_statictext_to_parent) + parse_node_descendants(root_node_copy, action_remove_redundant_statictext_node) + parse_node_descendants(root_node_copy, partial(action_replace_node_role, role_replacement_dict=ROLE_REPLACEMENT_DICT)) + parse_node_descendants(root_node_copy, action_merge_menuitem_and_option) + parse_node_descendants(root_node_copy, action_merge_description_list) + parse_node_descendants(root_node_copy, action_reformat_table) + parse_node_descendants(root_node_copy, action_merge_duplicated_headings) + + if mode == "str": + browser_content = translate_node_to_str(node=root_node_copy, mode="concise") + elif mode == "node": + browser_content = construct_new_DOM_with_visible_nodes(root_node_copy) + return browser_content + +def contains_keyword(title, keyword): + return keyword in title.lower() diff --git a/AgentOccam/plot.py b/AgentOccam/plot.py new file mode 100644 index 0000000..655376a --- /dev/null +++ b/AgentOccam/plot.py @@ -0,0 +1,291 @@ +import os +import csv +import json +import pandas as pd +import matplotlib.pyplot as plt +import matplotlib.colors as mcolors +import numpy as np + +from AgentOccam.utils import COLOR_DICT, TASK_ID_DICT, MERGED_SITE_TASK_ID_DICT, EVELUATOR_RECTIFICATIONS, RUN_NAME_DICT, TASK_LABELS_MULTISITE, TRAJECTORY_DIR_DICT, OUTPUT_DIR, TOTAL_TASK_NUM_DICT + + +def random_color_generator(): + import random + random.seed(65) + while True: + r = random.randint(0, 255) + g = random.randint(0, 255) + b = random.randint(0, 255) + yield f'#{r:02X}{g:02X}{b:02X}' + +def generate_random_colors(color_num): + colors = [next(random_color_generator) for _ in range(color_num)] + return colors + +def get_colors(trajectory_key_list): + return [COLOR_DICT[k] if k in COLOR_DICT else next(random_color_generator) for k in trajectory_key_list] + +def parse_summary_csv_files(root_dir, site_list, mode="single_site"): + total_reward = 0 + total_tasks = 0 + net_total_reward = 0 + + id_list = [] + for site in site_list: + if mode == "multiple_site": + id_list += TASK_ID_DICT[site] + elif mode == "single_site": + id_list += MERGED_SITE_TASK_ID_DICT[site] + + for subdir, _, files in os.walk(root_dir): + for file in files: + if file == 'summary.csv': + filepath = os.path.join(subdir, file) + with open(filepath, 'r') as csv_file: + csv_reader = csv.DictReader(csv_file) + for row in csv_reader: + task_id = int(row['task_id']) + if task_id in id_list: + total_tasks += 1 + total_reward += float(row['reward']) + net_total_reward += 1 if float(row['reward']) == 1. else 0 + + if total_tasks > 0: + return total_reward, net_total_reward, total_tasks + else: + return 0.0, 0.0, 0.0 + +def parse_json_files(root_dir, site_list, evaluator="after", mode="single_site"): + total_reward = 0 + total_tasks = 0 + net_total_reward = 0 + + id_list = [] + for site in site_list: + if mode == "multiple_site": + id_list += TASK_ID_DICT[site] + elif mode == "single_site": + id_list += MERGED_SITE_TASK_ID_DICT[site] + + for filename in os.listdir(root_dir): + if filename.endswith(".json"): + try: + trajectory_obj = json.load(open(os.path.join(root_dir, filename), "r")) + if trajectory_obj["id"] in id_list: + if (evaluator=="before" and trajectory_obj["id"] not in EVELUATOR_RECTIFICATIONS) or evaluator=="after": + if "trajectory" in trajectory_obj.keys(): + last_step = trajectory_obj["trajectory"][-1] + reward = float(last_step['reward']) if "reward" in last_step.keys() else last_step['success'] + else: + reward = trajectory_obj["score"] + total_tasks += 1 + total_reward += reward + net_total_reward += 1 if reward == 1. else 0 + except Exception as e: + print(os.path.join(root_dir, filename)) + print(e) + + if total_tasks > 0: + return total_reward, net_total_reward, total_tasks + else: + return 0.0, 0.0, 0.0 + +def find_summary_csv_files(directories): + summary_files = [] + for directory in directories: + for root, _, files in os.walk(directory): + for file in files: + if file == 'summary.csv': + summary_files.append(os.path.join(root, file)) + return summary_files + +def read_rewards_with_dir_names(summary_files): + rewards_with_dirs = {} + for file in summary_files: + directory_name = os.path.basename(os.path.dirname(file)) + df = pd.read_csv(file) + if 'reward' in df.columns: + rewards_with_dirs[directory_name] = df['reward'].tolist() + return rewards_with_dirs + +def write_rewards_to_csv(rewards, output_file): + with open(output_file, 'w') as f: + f.write('reward\n') + for reward in rewards: + f.write(f'{reward}\n') + +def load_reward(root_dir, evaluator="after"): + reward_dict = {} + net_reward_dict = {} + for filename in os.listdir(root_dir): + if filename.endswith(".json"): + trajectory_obj = json.load(open(os.path.join(root_dir, filename), "r")) + trajectory_id = trajectory_obj["id"] + if (evaluator=="before" and trajectory_obj["id"] not in EVELUATOR_RECTIFICATIONS) or evaluator=="after": + if "trajectory" in trajectory_obj.keys(): + last_step = trajectory_obj["trajectory"][-1] + reward_dict[trajectory_id] = float(last_step['reward']) if "reward" in last_step.keys() else last_step['success'] + else: + reward_dict[trajectory_id] = float(trajectory_obj["score"]) + net_reward_dict[trajectory_id] = 1. if reward_dict[trajectory_id] == 1. else 0. + reward_list = [] + net_reward_list = [] + print("\n"+root_dir) + for i in range(812): + if i in reward_dict.keys(): + reward_list.append(reward_dict[i]) + else: + print(f"{i},", end="") + # reward_list.append(-1) + reward_list.append(0) + if i in net_reward_dict.keys(): + net_reward_list.append(net_reward_dict[i]) + else: + # net_reward_list.append(-1) + net_reward_list.append(0) + return reward_list, net_reward_list + +def compare_rewards(trajectory_key_list=None, evaluator="after"): + import pandas as pd + import matplotlib.pyplot as plt + + basenames = [RUN_NAME_DICT[k] for k in trajectory_key_list] + + tasks = list(range(812)) + labels = TASK_LABELS_MULTISITE + rewards = [load_reward(TRAJECTORY_DIR_DICT[k], evaluator=evaluator)[1] for k in trajectory_key_list] + + label_list = [] + label_index_dict = {} + for i, label in enumerate(labels): + if label not in label_list: + label_list.append(label) + label_index_dict[label] = [] + label_index_dict[label].append(i) + sorted_index_list = [] + for label in label_list: + sorted_index_list += label_index_dict[label] + tasks = [tasks[i] for i in sorted_index_list] + labels = [labels[i] for i in sorted_index_list] + for i in range(len(rewards)): + rewards[i] = [int(rewards[i][j]) for j in sorted_index_list] + + data = { + 'Task': tasks, + 'Site': labels, + **{basename: reward for basename, reward in zip(basenames, rewards)} + } + + df = pd.DataFrame(data) + + csvfile = open(os.path.join(OUTPUT_DIR, "compare.csv"), "w") + csv_writer = csv.writer(csvfile) + csv_writer.writerow(["task", "site"]+basenames) + for i, reward in enumerate(zip(*tuple(rewards))): + csv_writer.writerow([df['Task'][i], df['Site'][i]]+list(reward)) + +def plot_comparative_heatmap(): + import pandas as pd + import numpy as np + import matplotlib.pyplot as plt + + file_path = os.path.join(OUTPUT_DIR, 'compare.csv') + data = pd.read_csv(file_path) + + for site in ["shopping_admin", "shopping", "reddit", "gitlab", "map", "multisite"]: + site_data = data[data['site'] == site] + approach_keys = [k for k in site_data.keys() if k not in ["task", "site"]] + + heatmap_data = pd.DataFrame({ + k: site_data[k] for k in approach_keys + }) + + heatmap_values = heatmap_data.values + + colors = ['#EFEFEF', '#2A786C'] + cmap = mcolors.LinearSegmentedColormap.from_list("CustomCmap", colors) + plt.figure(figsize=(10, 20)) + plt.imshow(heatmap_values, cmap=cmap, aspect='auto') + + plt.xticks(ticks=[0.5 + k for k in list(range(len(approach_keys)))], labels=[]*len(approach_keys)) + plt.yticks([]) + + ax = plt.gca() + + ax.set_yticks([]) + + ax_left = plt.gca().twinx() + ax_left.set_yticks(np.arange(len(site_data))+1) + ax_left.set_yticklabels(site_data.iloc[::-1]["task"], fontsize=3) + + ax_right = plt.gca().twinx() + ax_right.set_yticks(np.arange(len(site_data))+1) + ax_right.set_yticklabels(site_data.iloc[::-1]["task"], fontsize=3) + ax_right.yaxis.set_label_position("right") + + plt.grid(color='white', linestyle='-', linewidth=5) + + plt.tight_layout() + plt.savefig(os.path.join(OUTPUT_DIR, f"figures/{site}_{len(approach_keys)}.png"), dpi=256) + +def plot_comparative_bar_chart(categories, data_list, labels, colors, title="Comparative Bar Chart", ylabel="Values", figure_name="bar"): + os.makedirs(os.path.join(OUTPUT_DIR, "figures"), exist_ok=True) + + bar_width = 1/(len(labels)+1) + x = np.arange(len(categories)) + + plt.rc('font', family='serif') + plt.figure(figsize=(9, 2)) + + for i, (data, label, color) in enumerate(zip(data_list, labels, colors)): + plt.bar(x + i * bar_width, data, width=bar_width, label=label, color=color) + + for i, (data, label) in enumerate(zip(data_list, labels)): + for j, value in enumerate(data): + plt.text(x[j] + i * bar_width, value, f"{value:.1f}" if isinstance(value, float) else f"{value}", ha='center', va='bottom', fontsize=5) + + if title: + plt.title(title) + plt.ylabel(ylabel, fontsize=11) + plt.xticks(x + bar_width * (len(labels) - 1) / 2, [c.replace("_", " ").capitalize() for c in categories], fontsize=11) + plt.legend(loc='lower center', fontsize=11, bbox_to_anchor=(0.5, 1.05), ncol=3) + plt.grid(axis='y') + + plt.ylim(0, 65) + + plt.tight_layout() + plt.savefig(os.path.join(OUTPUT_DIR, f"figures/{figure_name}.pdf"), dpi=256) + plt.close() + +def compute_success_rate(trajectory_key_list=None, evaluator="after"): + site_lists = ["ALL", "SHOPPING", "SHOPPING_ADMIN", "GITLAB", "MAP", "REDDIT", "MULTISITE"] + csvfile = open(os.path.join(OUTPUT_DIR, "result.csv"), "w") + csv_writer = csv.writer(csvfile) + csv_writer.writerow(["basename", "site", "total_reward", "net_total_reward", "total_tasks"]) + + categories = site_lists + + trajectory_key_list = trajectory_key_list if trajectory_key_list else [k for k in sorted(list(TRAJECTORY_DIR_DICT.keys()), reverse=False)] + labels = [RUN_NAME_DICT[i] for i in trajectory_key_list] + + colors = get_colors(trajectory_key_list) + + reward_percentage_list = {l:[] for l in labels} + net_reward_percentage_list = {l:[] for l in labels} + + for i, key in enumerate(trajectory_key_list): + root_directory = TRAJECTORY_DIR_DICT[key] + basename = labels[i] + for site_list in site_lists: + total_reward, net_total_reward, total_tasks = parse_json_files(root_directory, [site_list], evaluator=evaluator, mode="multiple_site") + total_tasks = TOTAL_TASK_NUM_DICT[site_list] + reward_percentage_list[basename].append(total_reward/total_tasks*100) + net_reward_percentage_list[basename].append(net_total_reward/total_tasks*100) + csv_writer.writerow([basename, site_list, total_reward, net_total_reward, total_tasks]) + csvfile.close() + plot_comparative_bar_chart(categories=categories, data_list=[reward_percentage_list[l] for l in labels], labels=labels, colors=colors, title="Reward Percentage", figure_name="reward_percentage") + plot_comparative_bar_chart(categories=categories, data_list=[net_reward_percentage_list[l] for l in labels], labels=labels, colors=colors, title="", ylabel="Success Rate", figure_name="net_reward_percentage") + +if __name__ == "__main__": + ablation_study_key_list = [7, 3, 4, 5, 6, 0] + compute_success_rate(ablation_study_key_list) \ No newline at end of file diff --git a/AgentOccam/prompts/AgentOccam_prompt.py b/AgentOccam/prompts/AgentOccam_prompt.py new file mode 100644 index 0000000..ee738e1 --- /dev/null +++ b/AgentOccam/prompts/AgentOccam_prompt.py @@ -0,0 +1,92 @@ +actor = { +"instruction_template": { + "with_planning": '''You are an AI assistant performing tasks on a web browser. You will be provided with task objective, current step, web page observations, previous plans, and interaction history. You need to issue an action for this step. + +Generate the response in the following format: +{output_specifications} + +You are ONLY allowed to use the following action commands. Strictly adheres to the given format. Only issue one single action. +If you think you should refine the plan, use the following actions: +{planning_specifications} +Otherwise, use the following actions: +{navigation_specifications}''', + + "without_planning": '''You are an AI assistant performing tasks on a web browser. You will be provided with task objective, current step, web page observations, and other relevant information. You need to issue an action for this step. + +Generate the response in the following format: +{output_specifications} + +You are ONLY allowed to use the following action commands. Strictly adheres to the given format. Only issue one single action. +{navigation_specifications}''' +}, + +"input_template":'''{input}''', + +"QA": { +"instruction_template": '''You are a proficient assistant good at answering web page related questions. Given the web page textual description, you are required to answer the question. + +Generate the response in the following format: +RESPONSE: +Your response here. + +Adhere to the following response requirements: +* If you are not fully sure that you can answer the question correcly with the information given, only take note of crucial relevant information. +* Otherwise, if you are confident about the answer, return your full answer. Ensure that your response is correct and comprehensive that fully explain your conclusion.''', +"input_template": '''WEB PAGE CONTENT: +{current_observation} + +QUESTION: +{objective}''' +}, + +"planning": { +"instruction_template": '''You are an AI assistant performing tasks on a web browser. You will be provided with task objective, current step, url, web page observations, previous plans, and actions. You need to issue a plan for this step. + +Generate the response in the following format: +{output_specifications} + +You are ONLY allowed to use the following planning commands. Strictly adheres to the given format. Only issue one single planning command. +{planning_specifications}''', +"input_template": '''''' +}, + +"reflection": { +"instruction_template": '''You are an AI assistant performing tasks on a web browser. You will be provided with task objective, current step, url, web page observations, previous plans, and actions. You need to reflect on past mistakes, take corrective action, and maximize future rewards. + +Generate the response in the following format: +{output_specifications} + +You are ONLY allowed to use the following action commands. Strictly adheres to the given format. Only issue one single action. +If you think you should refine the plan, use the following actions: +{planning_specifications} +Otherwise, use the following actions: +{navigation_specifications}''', +"input_template": '''''' +}, +} +critic = { + +"harsh": {"instruction_template": '''Below are the objective (high-level goal) and corresponding web observations and actions I took to navigate the web and achieve the goal, which has proven to be **unsuccessful**. As the objective is fully achievable within the current environment, I am expecting skeptical feedback on why I failed based on my interaction history and the current state. + +Adhere to the following output format: +{output_specifications}''', + + +"input_template": '''The following is all my interaction history and current state: +{input}'''}, + +"normal": { + "instruction_template": '''You are a seasoned web navigator. You now assess the performance of another web navigation agent based on the objective, their previous interaction history and the web's current state.\nAdhere to the following output format:\n{output_specifications}''', + "input_template": '''The following is all my interaction history and current state:\n{input}''', +} + +} +judge = { +"instruction_template": '''You are a seasoned web navigator. You now assess the value and risk of serveral web navigation actions based on the objective, the previous interaction history and the web's current state. Then, you select the action with the most value and least risk with which you would earn the maximum objective fulfillment reward in the future. + +Adhere to the following output format: +{output_specifications} + +Note that `branch` and `prune` are planning actions that will modify the PREVIOUS PLAN section and won't interact with the web environment.''', +"input_template": '''The following is the interaction history, current state, and action choices.\n{input}''' +} \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/click.txt b/AgentOccam/prompts/navigation_specifications/click.txt new file mode 100644 index 0000000..d31caf2 --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/click.txt @@ -0,0 +1 @@ +click [id]: To click on an element with its numerical ID on the webpage. E.g., `click [7]` If clicking on a specific element doesn't trigger the transition to your desired web state, this is due to the element's lack of interactivity or GUI visibility. In such cases, move on to interact with OTHER similar or relevant elements INSTEAD. \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/go_back.txt b/AgentOccam/prompts/navigation_specifications/go_back.txt new file mode 100644 index 0000000..9226898 --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/go_back.txt @@ -0,0 +1 @@ +go_back: To return to the previously viewed page. \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/go_home.txt b/AgentOccam/prompts/navigation_specifications/go_home.txt new file mode 100644 index 0000000..ba5c47f --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/go_home.txt @@ -0,0 +1 @@ +go_home: To return to the homepage where you can find other websites. \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/note.txt b/AgentOccam/prompts/navigation_specifications/note.txt new file mode 100644 index 0000000..564b301 --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/note.txt @@ -0,0 +1 @@ +note [content]: To take note of all important info w.r.t. completing the task to enable reviewing it later. E.g., `note [Spent $10 on 4/1/2024]` \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/scroll.txt b/AgentOccam/prompts/navigation_specifications/scroll.txt new file mode 100644 index 0000000..c6ca961 --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/scroll.txt @@ -0,0 +1 @@ +scroll [down/up] [reason]: To navigate the webpage content. E.g., `scroll [up] [Previous observations contain a link that might be useful.]` \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/stop.txt b/AgentOccam/prompts/navigation_specifications/stop.txt new file mode 100644 index 0000000..ece0610 --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/stop.txt @@ -0,0 +1 @@ +stop [answer]: To stop interaction and return response. Present your answer within the brackets. If the task doesn't require a textual answer or appears insurmountable, indicate "N/A" and additional reasons and all relevant information you gather as the answer. E.g., `stop [5h 47min]` \ No newline at end of file diff --git a/AgentOccam/prompts/navigation_specifications/type.txt b/AgentOccam/prompts/navigation_specifications/type.txt new file mode 100644 index 0000000..72b87cd --- /dev/null +++ b/AgentOccam/prompts/navigation_specifications/type.txt @@ -0,0 +1 @@ +type [id] [content] [press_enter_after=0|1]: To type content into a field with a specific ID. By default, the "Enter" key is pressed after typing unless `press_enter_after` is set to 0. E.g., `type [15] [Carnegie Mellon University] [1]` If you can't find what you're looking for on your first attempt, consider refining your search keywords by breaking them down or trying related terms. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/action.txt b/AgentOccam/prompts/output_specifications/action.txt new file mode 100644 index 0000000..485b52a --- /dev/null +++ b/AgentOccam/prompts/output_specifications/action.txt @@ -0,0 +1 @@ +Select your action here. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/action_assessment.txt b/AgentOccam/prompts/output_specifications/action_assessment.txt new file mode 100644 index 0000000..e65d47a --- /dev/null +++ b/AgentOccam/prompts/output_specifications/action_assessment.txt @@ -0,0 +1 @@ +Assess the value and risk of each action. Consider both the best-case and worst-case outcomes resulting from its implementation. Itemize the assessment using this format: `- action [action_id]: [action value, including but not limited to what outcomes you can expect by executing the action, or whether the note is of the most correct and comprehensive content] [action risk, including but not limited to whether the note/stop content is correct, and whether you can gather more information by continuing playing rather than ending the trial] [{best_case}] [{worst_case}]`. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/action_candidates.txt b/AgentOccam/prompts/output_specifications/action_candidates.txt new file mode 100644 index 0000000..d1e2c48 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/action_candidates.txt @@ -0,0 +1 @@ +Propose ALL potential actions at this step. Itemize the actions using this format: `- reason: [{reason_for_proposing_the_following_action0}]\n- action: [{action0_command}]\n\n- reason: [{reason_for_proposing_the_following_action1}]\n- action: [{action1_command}]\n\n...`. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/action_selection.txt b/AgentOccam/prompts/output_specifications/action_selection.txt new file mode 100644 index 0000000..4510590 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/action_selection.txt @@ -0,0 +1 @@ +List the numerical id of your selected action here. You can only choose one action. E.g., `1`. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/interaction_history_summary.txt b/AgentOccam/prompts/output_specifications/interaction_history_summary.txt new file mode 100644 index 0000000..6817fc9 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/interaction_history_summary.txt @@ -0,0 +1 @@ +Emphasize all important details in the INTERACTION HISTORY section. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/mistakes.txt b/AgentOccam/prompts/output_specifications/mistakes.txt new file mode 100644 index 0000000..f2a13af --- /dev/null +++ b/AgentOccam/prompts/output_specifications/mistakes.txt @@ -0,0 +1,26 @@ +Point out the major mistakes of previous steps by ONLY using the following templates: + - You have make a reasoning mistake by "{quote}". The correct reasoning should be "{correction}". + - You should check the "{link_name}" link first. + - You should know that the recent order table doesn't include all previous orders. Don't hush to a conclusion. + - You have missed important details on this page: {details}. + - I don't think your answer follow the task requirements. That's a fault I wouldn't expect. Reconsider seriously. + - You have employed different approaches/the same approach many times to do the task but failed. The task assigner might just want to challenge you to answer no and there might be no answer for this brain teaser question. + - If the task ask for the most extreme case (e.g., with highest price), I suggest you sort them by that key first. + - If there are multiple requirements for an item, break down the requirements and search them one by one. + - The active plan is a complex task. Don't rush. Further break down the task by using the planning commands. + - There might be multiple relevant orders to check before reach the conclusion. First, view ALL previous orders to finalize the order checklist and take notes of orders to be checked with `note [note_content]` command while viewing. Second, view the order details one by one and take notes of all crucial information. Finally, view all notes and think step by step before concluding the answer. + - You have reasoned too much in one step which leads to errors. Break down the task with planning. + - You should change the "selected" state of the items in the combobox. + - From my observation and consideration, I suggest you conclude the task as there's no answer even though you have tried multiple times with different approaches. + - When the task mentioned "category", it imples you can navigate to that category by selecting menus step by step. Select the most relevant first and the subcategories would appear. Select the appropriate subcategory then. + - You have not gone over all the reviews, {review_page_num} pages in total. + - You have not gone over all the items, {item_page_num} pages in total. + - Don't take the same notes multiple times. + - You should select and click the radio (required field) first. + - You should go over all relevant items and take notes of all crucial information with `note [note_content]`. Then finalize your choice by carefully consider based on your notes. + - Don't submit yet. Just show the form completion page. Retry. + - You missed a required field before submission, which leads to the failure of your last attempt. Retry. + - Canceled Orders and pending orders are not fulfilled orders. + - There are {order_num} relevant orders on this page, which is/are {order_ids}. You have viewed {order_ids} and taken notes, and {order_ids} still requires reviewing and taking notes. + - You have gone over all review/item/order pages. + - Except when keywords "category", "subcategories", etc are specifically mentioned in the objective, the fastest way to find items is to use the `search` feature. diff --git a/AgentOccam/prompts/output_specifications/observation_description.txt b/AgentOccam/prompts/output_specifications/observation_description.txt new file mode 100644 index 0000000..e05ed36 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/observation_description.txt @@ -0,0 +1 @@ +Describe information in the CURRENT OBSERVATION section. Emphasize elements and features that are relevant or potentially helpful for fulfilling the objective in detail. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/observation_highlight.txt b/AgentOccam/prompts/output_specifications/observation_highlight.txt new file mode 100644 index 0000000..0c321e3 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/observation_highlight.txt @@ -0,0 +1 @@ +List the numerical ids of elements on the current webpage based on which you would issue your action. Also include elements on the current webpage you would attend to if you fail in the future and have to restore to this step. Don't include elements from the previous pages. Select elements at a higher hierarchical level if most their children nodes are considered crucial. Sort by relevance and potential values from high to low, and separate the ids with commas. E.g., `1321, 52, 756, 838`. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/plan_progress_assessment.txt b/AgentOccam/prompts/output_specifications/plan_progress_assessment.txt new file mode 100644 index 0000000..989fdc5 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/plan_progress_assessment.txt @@ -0,0 +1 @@ +Review critically why the plans have not been fulfilled or the objective achieved. Justify your assessment with detailed evidence drawn from the objective, observations, and actions taken. Itemize the assessment using this format: `- plan [{plan_id}]\n\t[{step_ids_taken_for_this_milestone}] [{concrete_proof_from_observation}] [{why_milestone_a_not_successful}]\n\t[{step_ids_taken_for_this_milestone}] [{concrete_proof_from_observation}] [{why_milestone_b_not_successful}]\n\t...`. \ No newline at end of file diff --git a/AgentOccam/prompts/output_specifications/reason.txt b/AgentOccam/prompts/output_specifications/reason.txt new file mode 100644 index 0000000..5ba3c85 --- /dev/null +++ b/AgentOccam/prompts/output_specifications/reason.txt @@ -0,0 +1 @@ +Provide your rationale for proposing the subsequent action commands here. \ No newline at end of file diff --git a/AgentOccam/prompts/planning_specifications/branch.txt b/AgentOccam/prompts/planning_specifications/branch.txt new file mode 100644 index 0000000..8e0345b --- /dev/null +++ b/AgentOccam/prompts/planning_specifications/branch.txt @@ -0,0 +1 @@ +branch [parent_plan_id] [new_subplan_intent]: To create a new subplan based on PREVIOUS PLANS. Ensure the new subplan is connected to the appropriate parent plan by using its ID. E.g., `branch [12] [Navigate to the "Issue" page to check all the issues.]` \ No newline at end of file diff --git a/AgentOccam/prompts/planning_specifications/prune.txt b/AgentOccam/prompts/planning_specifications/prune.txt new file mode 100644 index 0000000..419568a --- /dev/null +++ b/AgentOccam/prompts/planning_specifications/prune.txt @@ -0,0 +1 @@ +prune [resume_plan_id] [reason]: To return to a previous plan state when the current plan is deemed impractical. Enter the ID of the plan state you want to resume. E.g., `prune [5] [The current page lacks items "black speaker," prompting a return to the initial page to restart the item search.]` \ No newline at end of file diff --git a/AgentOccam/utils.py b/AgentOccam/utils.py new file mode 100644 index 0000000..4e70e14 --- /dev/null +++ b/AgentOccam/utils.py @@ -0,0 +1,401 @@ +import os +import csv +import json + +CURRENT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +PARENT_DIR = os.path.dirname(CURRENT_DIR) +EVALUATOR_DIR = os.path.join(CURRENT_DIR, "config_files") +TRAJECTORY_DIR = os.path.join(PARENT_DIR, "AgentOccam-Trajectories") +OUTPUT_DIR = os.path.join(CURRENT_DIR, "output") +HOMEPAGE_URL = "localhost:4399" + + +TASK_ID_DICT = { + "ALL": list(range(812)), + "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790], + "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 757, 758, 761, 762, 763, 764, 765, 766, 767], + "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798], + "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735], + "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811], + "MULTISITE": [97, 265, 266, 267, 268, 424, 425, 426, 427, 428, 429, 430, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 687, 688, 737, 738, 739, 740, 741, 759, 760, 791], +} + +MERGED_SITE_TASK_ID_DICT = { + "ALL": list(range(812)), + "SHOPPING_ADMIN": [0, 1, 2, 3, 4, 5, 6, 11, 12, 13, 14, 15, 41, 42, 43, 62, 63, 64, 65, 77, 78, 79, 94, 95, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 119, 120, 121, 122, 123, 127, 128, 129, 130, 131, 157, 183, 184, 185, 186, 187, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 243, 244, 245, 246, 247, 288, 289, 290, 291, 292, 344, 345, 346, 347, 348, 374, 375, 423, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 470, 471, 472, 473, 474, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 676, 677, 678, 679, 680, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 790], + "MAP": [7, 8, 9, 10, 16, 17, 18, 19, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 97, 98, 99, 100, 101, 137, 138, 139, 140, 151, 152, 153, 154, 155, 218, 219, 220, 221, 222, 223, 224, 236, 237, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 265, 266, 267, 268, 287, 356, 363, 364, 365, 366, 367, 369, 370, 371, 372, 373, 377, 378, 379, 380, 381, 382, 383, 424, 425, 426, 427, 428, 429, 430, 737, 738, 739, 740, 741, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767], + "SHOPPING": [21, 22, 23, 24, 25, 26, 47, 48, 49, 50, 51, 96, 117, 118, 124, 125, 126, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 188, 189, 190, 191, 192, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 238, 239, 240, 241, 242, 260, 261, 262, 263, 264, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 298, 299, 300, 301, 302, 313, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 351, 352, 353, 354, 355, 358, 359, 360, 361, 362, 368, 376, 384, 385, 386, 387, 388, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 465, 466, 467, 468, 469, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 528, 529, 530, 531, 532, 571, 572, 573, 574, 575, 585, 586, 587, 588, 589, 653, 654, 655, 656, 657, 671, 672, 673, 674, 675, 689, 690, 691, 692, 693, 792, 793, 794, 795, 796, 797, 798], + "REDDIT": [27, 28, 29, 30, 31, 66, 67, 68, 69, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 580, 581, 582, 583, 584, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 681, 682, 683, 684, 685, 686, 687, 688, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735], + "GITLAB": [44, 45, 46, 102, 103, 104, 105, 106, 132, 133, 134, 135, 136, 156, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 205, 206, 207, 258, 259, 293, 294, 295, 296, 297, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, 339, 340, 341, 342, 343, 349, 350, 357, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 522, 523, 524, 525, 526, 527, 533, 534, 535, 536, 537, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 576, 577, 578, 579, 590, 591, 592, 593, 594, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 736, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 783, 784, 785, 786, 787, 788, 789, 791, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811] +} + +TASK_LABELS = ['shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'reddit', 'reddit', 'reddit', 'reddit', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping', 'map', 'map', 'map', 'map', 'map', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'map', 'gitlab', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'map', 'shopping', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'gitlab', 'map', 'map', 'map', 'map', 'map', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab'] +TASK_LABELS_MULTISITE = ['shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'reddit', 'reddit', 'reddit', 'reddit', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping', 'multisite', 'map', 'map', 'map', 'map', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'map', 'gitlab', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'multisite', 'multisite', 'multisite', 'multisite', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'map', 'map', 'map', 'map', 'map', 'shopping', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'reddit', 'gitlab', 'multisite', 'multisite', 'multisite', 'multisite', 'multisite', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'map', 'map', 'multisite', 'multisite', 'map', 'map', 'map', 'map', 'map', 'map', 'map', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'shopping_admin', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'shopping_admin', 'multisite', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'shopping', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab', 'gitlab'] + +TOTAL_TASK_NUM_DICT = { + "ALL": 812, + "SHOPPING_ADMIN": 182, + "MAP": 109, + "SHOPPING": 187, + "REDDIT": 106, + "GITLAB": 180, + "MULTISITE": 48 +} + +EVELUATOR_RECTIFICATIONS = [16, 17, 18, 19, 20, 97, 146, 178, 179, 180, 181, 182, 240, 254, 261, 262, 263, 264, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 308, 309, 310, 311, 312, 330, 351, 352, 353, 354, 355, 363, 364, 365, 366, 367, 415, 416, 417, 418, 489, 528, 529, 530, 531, 532, 583, 584, 601, 603, 606, 608, 629, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 653, 654, 655, 656, 657, 679, 707, 708, 709] + +TRAJECTORY_DIR_DICT = { + # Main Results + 0: os.path.join(TRAJECTORY_DIR, "AgentOccam"), + 1: os.path.join(TRAJECTORY_DIR, "AgentOccam-SteP"), + 2: os.path.join(TRAJECTORY_DIR, "AgentOccam-Judge"), + # Ablation Study + 3: os.path.join(TRAJECTORY_DIR, "reduced_action"), + 4: os.path.join(TRAJECTORY_DIR, "reduced_action-X_scrolling"), + 5: os.path.join(TRAJECTORY_DIR, "reduced_action-X_scrolling-obs_opt"), + 6: os.path.join(TRAJECTORY_DIR, "reduced_action-X_scrolling-obs_opt-history"), + # Replications + 7: os.path.join(TRAJECTORY_DIR, "WebArena-replication"), + 8: os.path.join(TRAJECTORY_DIR, "SteP-replication"), +} + +RUN_NAME_DICT = { + # Main Results + 0: "AgentOccam", + 1: "AgentOccam + SteP", + 2: "AgentOccam + Judge", + # Ablation Study + 3: "↓ Actions", + 4: "Above + X Scrolling", + 5: "Above + Obs Opt.", + 6: "Above + History", + # Replications + 7: "WebArena-replication", + 8: "SteP-replication", +} + +COLOR_DICT = { + # Main Results + 0: "#45C4B0", + 1: "#B68193", + 2: "#E7D5BF", + # Ablation Study + 3: "#594D47", + 4: "#6E8480", + 5: "#D98C6C", + 6: "#997E73", + # Replications + 7: "#203330", + 8: "#969696", +} + +def print_trajectory(json_path): + import json + item = json.load(open(json_path, "r")) + for step in item["trajectory"]: + obj = step["objective"] + url = step["url"] + obs = step["observation"] + reason = step["reason"] + action = step["action"] + if "plan" in step.keys(): + plan = step["plan"] + print(f"### Objective\n{obj}") + print(f"### Url\n{url}") + print(f"### Observation\n{obs}") + print(f"### Plan\n{plan}") + print(f"### Reason\n{reason}") + print(f"### Action\n{action}") + else: + print(f"### Objective\n{obj}") + print(f"### Url\n{url}") + print(f"### Observation\n{obs}") + print(f"### Reason\n{reason}") + print(f"### Action\n{action}") + +def find_task_by_intent_template_id(intent_template_id, task_config_data_dir=EVALUATOR_DIR): + import json + for filename in sorted([p for p in os.listdir(task_config_data_dir) if p[0].isdigit()], key=lambda item: int(os.path.basename(item)[:-len(".json")])): + if filename.endswith(".json"): + filepath = os.path.join(task_config_data_dir, filename) + with open(filepath, 'r', encoding='utf-8') as file: + try: + data = json.load(file) + if data.get('intent_template_id') == intent_template_id: + intent = data.get("intent") + print(f"File: {filename}\nIntent: {intent}") + except json.JSONDecodeError as e: + print(f"Error decoding JSON from file {filename}: {str(e)}") + +def traverse_task_configs(task_config_data_dir=EVALUATOR_DIR): + import json + task_id_dict = {} + for filename in sorted([p for p in os.listdir(task_config_data_dir) if p[0].isdigit()], key=lambda item: int(os.path.basename(item)[:-len(".json")])): + if filename.endswith(".json"): + filepath = os.path.join(task_config_data_dir, filename) + with open(filepath, 'r', encoding='utf-8') as file: + try: + data = json.load(file) + data_site = data["sites"][0] + if len(data["sites"]) > 1: + data_site = "multisite" + if data_site not in task_id_dict.keys(): + task_id_dict[data_site] = [] + task_id_dict[data_site].append(data["task_id"]) + except json.JSONDecodeError as e: + print(f"Error decoding JSON from file {filename}: {str(e)}") + for k in task_id_dict.keys(): + print(f"\"{k.upper()}\":", "["+", ".join([str(item) for item in sorted(task_id_dict[k], reverse=False)])+"],") + print() + for i in range(812): + for k in task_id_dict.keys(): + if i in task_id_dict[k]: + print(repr(k)+", ", end="") + +def load_json_obj_from_file(filepath): + with open(filepath, 'r') as f: + data = json.load(f) + return data + +def print_task_info_by_id(task_config_dir=EVALUATOR_DIR, task_ids=[65]): + for task_id in task_ids: + filepath = os.path.join(task_config_dir, f"{task_id}.json") + task_data = load_json_obj_from_file(filepath) + print(task_data["start_url"]) + +def clean_trajectory_files(input_dir, output_dir): + os.makedirs(output_dir, exist_ok=True) + for filename in [f"{i}.json" for i in range(812)]: + trajectory_obj = json.load(open(os.path.join(input_dir, filename), "r")) + new_obj = {} + for k in ["task", "id", "model"]: + new_obj[k] = trajectory_obj[k] + new_obj["type"] = "observation_action_space_refinement" + new_obj["objective"] = trajectory_obj["trajectory"][0]["objective"] + new_obj["trajectory"] = [] + for step in range(len(trajectory_obj["trajectory"])): + step_obj = {} + for k in ["url", "observation", "num_actions", "plan", "interaction_history_summary", "observation_description", "reason", "action", "observation_highlight_idxs", "done"]: + step_obj[k] = trajectory_obj["trajectory"][step][k] + step_obj["reward"] = trajectory_obj["trajectory"][step]["reward"] if trajectory_obj["trajectory"][step]["reward"] == 1. else 0. + new_obj["trajectory"].append(step_obj) + json.dump(new_obj, open(os.path.join(output_dir, filename), "w"), indent=4) + +def check_shopping_admin_login_expire(): + login_expire_dict = {} + for k in set(TRAJECTORY_DIR_DICT.keys())-set({16}): + for task_id in MERGED_SITE_TASK_ID_DICT["SHOPPING_ADMIN"]: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + step_0_data = trajectory_data["trajectory"][0] + if "username" in step_0_data["observation"].lower() and "password" in step_0_data["observation"].lower() and "sign in" in step_0_data["observation"].lower(): + if k in login_expire_dict.keys(): + login_expire_dict[k].append(task_id) + else: + login_expire_dict[k] = [task_id] + for k in sorted(list(login_expire_dict.keys())): + print(k) + print(login_expire_dict[k]) + +def check_reddit_post_limit(): + post_limit_dict = {} + for k in set(TRAJECTORY_DIR_DICT.keys())-set({16}): + for task_id in MERGED_SITE_TASK_ID_DICT["REDDIT"]: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + for step_data in trajectory_data["trajectory"]: + if "You cannot post more. Wait a while before trying again." in step_data["observation"]: + if k in post_limit_dict.keys(): + post_limit_dict[k].append(task_id) + else: + post_limit_dict[k] = [task_id] + break + for k in sorted(list(post_limit_dict.keys())): + print(k) + print(post_limit_dict[k]) + +def get_action_statistics(trajectory_list=[-1], action_list=["click", "type"]): + ACTION_WITH_ID_LIST = ["click", "type", "scroll", "goto", "note", "stop", "branch", "prune"] + trial_dict = {} + for k in trajectory_list: + trial_dict[k] = {} + for task_id in range(812): + if k != 16: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + for step_data in trajectory_data["trajectory"]: + for action in action_list: + if (action in ACTION_WITH_ID_LIST and f"{action} [" in step_data["action"]) or (action not in ACTION_WITH_ID_LIST and action in step_data["action"]): + if action in trial_dict[k].keys(): + trial_dict[k][action] += 1 + else: + trial_dict[k][action] = 1 + else: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"trace_{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + for step_data in trajectory_data["trace"]: + for action in action_list: + if (action in ACTION_WITH_ID_LIST and f"{action} [" in step_data["target"]) or (action not in ACTION_WITH_ID_LIST and action in step_data["target"]): + if action in trial_dict[k].keys(): + trial_dict[k][action] += 1 + else: + trial_dict[k][action] = 1 + csvfile = open(os.path.join(OUTPUT_DIR, "action_statistics.csv"), "w") + csv_writer = csv.writer(csvfile) + csv_writer.writerow(["TRIAL NAME"] + action_list) + for k in trajectory_list: + print(k) + csv_writer.writerow([RUN_NAME_DICT[k]] + [trial_dict[k][a] if a in trial_dict[k].keys() else 0 for a in action_list]) + for a in trial_dict[k].keys(): + print(a, trial_dict[k][a]) + +def get_avr_obs_token_num_statistics(trajectory_list=[-1]): + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained("gpt2") + trial_dict = {} + for k in trajectory_list: + trial_dict[k] = {} + for task_id in range(812): + site_label = TASK_LABELS_MULTISITE[task_id] + trajectory_total_token_num = 0 + if k != 16: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + step_num = len(trajectory_data["trajectory"]) + for step_data in trajectory_data["trajectory"]: + trajectory_total_token_num += len(tokenizer.tokenize(step_data["observation"])) + else: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"trace_{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + step_num = len(trajectory_data["trace"]) + for step_data in trajectory_data["trace"]: + for source_data in step_data["source"]: + trajectory_total_token_num += len(tokenizer.tokenize(source_data["content"])) + print(trajectory_total_token_num, step_num) + if site_label in trial_dict[k].keys(): + trial_dict[k][site_label]["total_token_num"] += trajectory_total_token_num + trial_dict[k][site_label]["total_step_num"] += step_num + else: + trial_dict[k][site_label] = {"total_token_num": trajectory_total_token_num, "total_step_num": step_num} + if "all" in trial_dict[k].keys(): + trial_dict[k]["all"]["total_token_num"] += trajectory_total_token_num + trial_dict[k]["all"]["total_step_num"] += step_num + else: + trial_dict[k]["all"] = {"total_token_num": trajectory_total_token_num, "total_step_num": step_num} + csvfile = open(os.path.join(OUTPUT_DIR, "avr_obs_token_num_statistics.csv"), "w") + csv_writer = csv.writer(csvfile) + SITES = ["ALL", "SHOPPING", "SHOPPING_ADMIN", "GITLAB", "MAP", "REDDIT", "MAP", "MULTISITE"] + csv_writer.writerow(["TRIAL NAME"] + SITES) + for k in trajectory_list: + csv_writer.writerow([RUN_NAME_DICT[k]] + ["{:.1f}".format(trial_dict[k][s.lower()]["total_token_num"]/trial_dict[k][s.lower()]["total_step_num"]) for s in SITES]) + +def get_avr_step_num_statistics(trajectory_list=[-1]): + trial_dict = {} + for k in trajectory_list: + trial_dict[k] = {} + for task_id in range(812): + site_label = TASK_LABELS_MULTISITE[task_id] + if k != 16: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + if site_label in trial_dict[k].keys(): + trial_dict[k][site_label] += len(trajectory_data["trajectory"]) + else: + trial_dict[k][site_label] = len(trajectory_data["trajectory"]) + if "all" in trial_dict[k].keys(): + trial_dict[k]["all"] += len(trajectory_data["trajectory"]) + else: + trial_dict[k]["all"] = len(trajectory_data["trajectory"]) + else: + filepath = os.path.join(TRAJECTORY_DIR_DICT[k], f"trace_{task_id}.json") + if not os.path.exists(filepath): + print(f"{filepath} doesn't exist.") + continue + trajectory_data = json.load(open(filepath, 'r')) + if site_label in trial_dict[k].keys(): + trial_dict[k][site_label] += len(trajectory_data["trace"]) + else: + trial_dict[k][site_label] = len(trajectory_data["trace"]) + if "all" in trial_dict[k].keys(): + trial_dict[k]["all"] += len(trajectory_data["trace"]) + else: + trial_dict[k]["all"] = len(trajectory_data["trace"]) + csvfile = open(os.path.join(OUTPUT_DIR, "avr_step_num_statistics.csv"), "w") + csv_writer = csv.writer(csvfile) + SITES = ["ALL", "SHOPPING", "SHOPPING_ADMIN", "GITLAB", "MAP", "REDDIT", "MULTISITE"] + csv_writer.writerow(["TRIAL NAME"] + SITES) + for k in trajectory_list: + csv_writer.writerow([RUN_NAME_DICT[k]] + ["{:.1f}".format(trial_dict[k][s.lower()]/TOTAL_TASK_NUM_DICT[s]) for s in SITES]) + +def compare_evaluators(dir1, dir2): + def compare_evaluator(i, file1, file2): + def load_json(file_path): + with open(file_path, 'r') as f: + return json.load(f) + + def compare_json(json1, json2, path=""): + differences = {} + + for key in json1: + new_path = f"{path}.{key}" if path else key + + if key not in json2: + differences[new_path] = json1[key] + else: + if isinstance(json1[key], dict) and isinstance(json2[key], dict): + nested_diff = compare_json(json1[key], json2[key], new_path) + differences.update(nested_diff) + elif json1[key] != json2[key]: + differences[new_path] = (json1[key], json2[key]) + + for key in json2: + new_path = f"{path}.{key}" if path else key + + if key not in json1: + differences[new_path] = json2[key] + + return differences + + json1 = load_json(file1) + json2 = load_json(file2) + + differences = compare_json(json1, json2) + + if differences: + print(f"# Task {i}", file=file) + for key, value in differences.items(): + if isinstance(value, tuple): + print("### {}\n{}\n{}".format(key, value[0], value[1]), file=file) + else: + print("### {}\n{}".format(key, value), file=file) + print(file=file) + + file = open(os.path.join(OUTPUT_DIR, "evaluator_differences.txt"), "w") + for i in range(812): + file1 = os.path.join(dir1, f"{i}.json") + file2 = os.path.join(dir2, f"{i}.json") + compare_evaluator(i, file1, file2) + +if __name__ == "__main__": + get_action_statistics(trajectory_list=[7, 3, 4, 5, 6, 0], action_list=["click", "hover", "type", "scroll", "go_back", "goto", "note", "stop", "go_home", "branch", "prune"]) \ No newline at end of file diff --git a/Agent_E/ae/config.py b/Agent_E/ae/config.py new file mode 100644 index 0000000..73beffb --- /dev/null +++ b/Agent_E/ae/config.py @@ -0,0 +1,26 @@ +# config.py at the project source code root +import os + +PROJECT_SOURCE_ROOT = os.path.dirname(os.path.abspath(__file__)) +SOURCE_LOG_FOLDER_PATH = os.path.join(PROJECT_SOURCE_ROOT, 'log_files') + +PROJECT_ROOT = os.path.dirname(PROJECT_SOURCE_ROOT) + +PROJECT_TEMP_PATH = os.path.join(PROJECT_ROOT, 'temp') + +USER_PREFERENCES_PATH = os.path.join(PROJECT_SOURCE_ROOT, 'user_preferences') +PROJECT_TEST_ROOT = os.path.join(PROJECT_ROOT, 'test') + +# Check if the log folder exists, and if not, create it +if not os.path.exists(SOURCE_LOG_FOLDER_PATH): + os.makedirs(SOURCE_LOG_FOLDER_PATH) + print(f"Created log folder at: {SOURCE_LOG_FOLDER_PATH}") + +#create user prefernces folder if it does not exist +if not os.path.exists(USER_PREFERENCES_PATH): + os.makedirs(USER_PREFERENCES_PATH) + print(f"Created user preferences folder at: {USER_PREFERENCES_PATH}") + +if not os.path.exists(PROJECT_TEMP_PATH): + os.makedirs(PROJECT_TEMP_PATH) + print(f"Created temp folder at: {PROJECT_TEMP_PATH}") diff --git a/Agent_E/ae/core/__init__.py b/Agent_E/ae/core/__init__.py new file mode 100644 index 0000000..8bc702d --- /dev/null +++ b/Agent_E/ae/core/__init__.py @@ -0,0 +1,9 @@ +from Agent_E.ae.core import agents +from Agent_E.ae.core import memory +from Agent_E.ae.core import skills +from Agent_E.ae.core.autogen_wrapper import AutogenWrapper +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.core.post_process_responses import final_reply_callback_user_proxy +from Agent_E.ae.core.prompts import LLM_PROMPTS +from Agent_E.ae.core.system_orchestrator import SystemOrchestrator +from Agent_E.ae.core.ui_manager import UIManager diff --git a/Agent_E/ae/core/agents/__init__.py b/Agent_E/ae/core/agents/__init__.py new file mode 100644 index 0000000..4c31537 --- /dev/null +++ b/Agent_E/ae/core/agents/__init__.py @@ -0,0 +1 @@ +from Agent_E.ae.core.agents.browser_nav_agent import BrowserNavAgent \ No newline at end of file diff --git a/Agent_E/ae/core/agents/browser_nav_agent.py b/Agent_E/ae/core/agents/browser_nav_agent.py new file mode 100644 index 0000000..d7e6499 --- /dev/null +++ b/Agent_E/ae/core/agents/browser_nav_agent.py @@ -0,0 +1,164 @@ +import importlib +import os +from datetime import datetime +from string import Template +from typing import Any + +import autogen # type: ignore + +from Agent_E.ae.core.memory.static_ltm import get_user_ltm +from Agent_E.ae.core.prompts import LLM_PROMPTS +from Agent_E.ae.core.skills.click_using_selector import click as click_element + +# from Agent_E.ae.core.skills.enter_text_and_click import enter_text_and_click +from Agent_E.ae.core.skills.enter_text_using_selector import bulk_enter_text +from Agent_E.ae.core.skills.enter_text_using_selector import entertext +from Agent_E.ae.core.skills.get_dom_with_content_type import get_dom_with_content_type +from Agent_E.ae.core.skills.get_url import geturl +from Agent_E.ae.core.skills.open_url import openurl +from Agent_E.ae.core.skills.pdf_text_extractor import extract_text_from_pdf + +#from Agent_E.ae.core.skills.pdf_text_extractor import extract_text_from_pdf +from Agent_E.ae.core.skills.press_key_combination import press_key_combination +from Agent_E.ae.core.skills.skill_registry import skill_registry +from Agent_E.ae.utils.logger import logger + + +class BrowserNavAgent: + def __init__(self, model_config_list, llm_config_params: dict[str, Any], system_prompt: str|None, browser_nav_executor: autogen.UserProxyAgent): # type: ignore + """ + Initialize the BrowserNavAgent and store the AssistantAgent instance + as an instance attribute for external access. + + Parameters: + - model_config_list: A list of configuration parameters required for AssistantAgent. + - llm_config_params: A dictionary of configuration parameters for the LLM. + - system_prompt: The system prompt to be used for this agent or the default will be used if not provided. + - user_proxy_agent: An instance of the UserProxyAgent class. + """ + self.browser_nav_executor = browser_nav_executor + user_ltm = self.__get_ltm() + + system_message = LLM_PROMPTS["BROWSER_AGENT_PROMPT"] + if system_prompt and len(system_prompt) > 0: + if isinstance(system_prompt, list): + system_message = "\n".join(system_prompt) + else: + system_message = system_prompt + logger.info(f"Using custom system prompt for BrowserNavAgent: {system_message}") + + system_message = system_message + "\n" + f"Today's date is {datetime.now().strftime('%d %B %Y')}" + if user_ltm: #add the user LTM to the system prompt if it exists + user_ltm = "\n" + user_ltm + system_message = Template(system_message).substitute(basic_user_information=user_ltm) + logger.info(f"Browser nav agent using model: {model_config_list[0]['model']}") + self.agent = autogen.ConversableAgent( + name="browser_navigation_agent", + system_message=system_message, + llm_config={ + "config_list": model_config_list, + **llm_config_params #unpack all the name value pairs in llm_config_params as is + }, + ) + self.__register_skills() + + + def __get_ltm(self): + """ + Get the the long term memory of the user. + returns: str | None - The user LTM or None if not found. + """ + return get_user_ltm() + + + def __register_skills(self): + """ + Register all the skills that the agent can perform. + """ + + # Register each skill for LLM by assistant agent and for execution by user_proxy_agen + + self.agent.register_for_llm(description=LLM_PROMPTS["OPEN_URL_PROMPT"])(openurl) + self.browser_nav_executor.register_for_execution()(openurl) + + # self.agent.register_for_llm(description=LLM_PROMPTS["ENTER_TEXT_AND_CLICK_PROMPT"])(enter_text_and_click) + # self.browser_nav_executor.register_for_execution()(enter_text_and_click) + + self.agent.register_for_llm(description=LLM_PROMPTS["GET_DOM_WITH_CONTENT_TYPE_PROMPT"])(get_dom_with_content_type) + self.browser_nav_executor.register_for_execution()(get_dom_with_content_type) + + self.agent.register_for_llm(description=LLM_PROMPTS["CLICK_PROMPT"])(click_element) + self.browser_nav_executor.register_for_execution()(click_element) + + self.agent.register_for_llm(description=LLM_PROMPTS["GET_URL_PROMPT"])(geturl) + self.browser_nav_executor.register_for_execution()(geturl) + + self.agent.register_for_llm(description=LLM_PROMPTS["BULK_ENTER_TEXT_PROMPT"])(bulk_enter_text) + self.browser_nav_executor.register_for_execution()(bulk_enter_text) + + self.agent.register_for_llm(description=LLM_PROMPTS["ENTER_TEXT_PROMPT"])(entertext) + self.browser_nav_executor.register_for_execution()(entertext) + + self.agent.register_for_llm(description=LLM_PROMPTS["PRESS_KEY_COMBINATION_PROMPT"])(press_key_combination) + self.browser_nav_executor.register_for_execution()(press_key_combination) + + self.agent.register_for_llm(description=LLM_PROMPTS["EXTRACT_TEXT_FROM_PDF_PROMPT"])(extract_text_from_pdf) + self.browser_nav_executor.register_for_execution()(extract_text_from_pdf) + + ''' + # Register reply function for printing messages + self.browser_nav_executor.register_reply( # type: ignore + [autogen.Agent, None], + reply_func=print_message_from_user_proxy, + config={"callback": None}, + ) + self.agent.register_reply( # type: ignore + [autogen.Agent, None], + reply_func=print_message_from_browser_agent, + config={"callback": None}, + ) + ''' + self.__load_additional_skills() + + #print(f">>> Function map: {self.browser_nav_executor.function_map}") # type: ignore + + + def __load_additional_skills(self): + """ + Dynamically load additional skills from directories or specific Python files + specified by an environment variable. + """ + # Get additional skill directories or files from environment variable + additional_skill_dirs: str = os.getenv('ADDITIONAL_SKILL_DIRS', "") + if len(additional_skill_dirs) == 0: + logger.debug("No additional skill directories or files specified.") + return + + additional_skill_paths: list[str] = additional_skill_dirs.split(',') + + for skill_path in additional_skill_paths: + skill_path = skill_path.strip() # Strip whitespace + + if os.path.isdir(skill_path): + # If the path is a directory, process all .py files in it + for filename in os.listdir(skill_path): + if filename.endswith(".py"): + module_name = filename[:-3] # Remove .py extension + module_path = f"{skill_path.replace('/', '.')}.{module_name}" + importlib.import_module(module_path) + + elif skill_path.endswith(".py") and os.path.isfile(skill_path): + # If the path is a specific .py file, load it directly + module_name = os.path.basename(skill_path)[:-3] # Strip .py extension + directory_path = os.path.dirname(skill_path).replace('/', '.') + module_path = f"{directory_path}.{module_name}" + importlib.import_module(module_path) + else: + logger.warning(f"Invalid skill path specified: {skill_path}") + + # Register the skills that were dynamically discovered + for skill in skill_registry: + self.agent.register_for_llm(description=skill['description'])(skill['func']) + self.browser_nav_executor.register_for_execution()(skill['func']) + logger.debug(f"Registered additional skill: {skill['name']}") + diff --git a/Agent_E/ae/core/agents/high_level_planner_agent.py b/Agent_E/ae/core/agents/high_level_planner_agent.py new file mode 100644 index 0000000..388886f --- /dev/null +++ b/Agent_E/ae/core/agents/high_level_planner_agent.py @@ -0,0 +1,77 @@ +import os +from datetime import datetime +from string import Template +from typing import Any + +import autogen # type: ignore +from autogen import ConversableAgent # type: ignore + +from Agent_E.ae.core.memory.static_ltm import get_user_ltm +from Agent_E.ae.core.post_process_responses import final_reply_callback_planner_agent as print_message_as_planner # type: ignore +from Agent_E.ae.core.prompts import LLM_PROMPTS +from Agent_E.ae.core.skills.get_user_input import get_user_input +from Agent_E.ae.utils.logger import logger + + +class PlannerAgent: + def __init__(self, model_config_list, llm_config_params: dict[str, Any], system_prompt: str|None, user_proxy_agent:ConversableAgent): # type: ignore + """ + Initialize the PlannerAgent and store the AssistantAgent instance + as an instance attribute for external access. + + Parameters: + - model_config_list: A list of configuration parameters required for AssistantAgent. + - llm_config_params: A dictionary of configuration parameters for the LLM. + - system_prompt: The system prompt to be used for this agent or the default will be used if not provided. + - user_proxy_agent: An instance of the UserProxyAgent class. + """ + enable_user_input = os.getenv("PLANNER_USER_INPUT_SKILL_ENABLED", "false").lower() == "true" + + user_ltm = self.__get_ltm() + system_message = LLM_PROMPTS["PLANNER_AGENT_PROMPT"] + + if system_prompt and len(system_prompt) > 0: + if isinstance(system_prompt, list): + system_message = "\n".join(system_prompt) + else: + system_message = system_prompt + logger.info(f"Using custom system prompt for PlannerAgent: {system_message}") + + + if user_ltm: #add the user LTM to the system prompt if it exists + user_ltm = "\n" + user_ltm + system_message = Template(system_message).substitute(basic_user_information=user_ltm) + system_message = system_message + "\n" + f"Today's date is {datetime.now().strftime('%d %B %Y')}" + logger.info(f"Planner agent using model: {model_config_list[0]['model']}") + + self.agent = autogen.AssistantAgent( + name="planner_agent", + system_message=system_message, + llm_config={ + "config_list": model_config_list, + **llm_config_params #unpack all the name value pairs in llm_config_params as is + }, + ) + + if enable_user_input: + # Register get_user_input skill for LLM by assistant agent + self.agent.register_for_llm(description=LLM_PROMPTS["GET_USER_INPUT_PROMPT"])(get_user_input) + # Register get_user_input skill for execution by user_proxy_agent + user_proxy_agent.register_for_execution()(get_user_input) + else: + logger.debug("User input skill is disabled for PlannerAgent") + + self.agent.register_reply( # type: ignore + [autogen.AssistantAgent, None], + reply_func=print_message_as_planner, + config={"callback": None}, + ignore_async_in_sync_chat=True + ) + + def __get_ltm(self): + """ + Get the the long term memory of the user. + returns: str | None - The user LTM or None if not found. + """ + return get_user_ltm() + diff --git a/Agent_E/ae/core/agents_llm_config.py b/Agent_E/ae/core/agents_llm_config.py new file mode 100644 index 0000000..42da739 --- /dev/null +++ b/Agent_E/ae/core/agents_llm_config.py @@ -0,0 +1,197 @@ + +import json +import os +from typing import Any + +from dotenv import load_dotenv + +from Agent_E.ae.utils.logger import logger + + +class AgentsLLMConfig: + # Mapping from environment keys to model config keys + KEY_MAPPING_ENV_MODEL: dict[str, str] = { + "AUTOGEN_MODEL_NAME": "model", + "AUTOGEN_MODEL_API_KEY": "api_key", + "AUTOGEN_MODEL_BASE_URL": "base_url", + "AUTOGEN_MODEL_API_TYPE": "api_type", + "AUTOGEN_MODEL_API_VERSION": "api_version", + } + + # Mapping from environment keys to LLM config keys + KEY_MAPPING_ENV_LLM: dict[str, str] = { + "AUTOGEN_LLM_TEMPERATURE": "temperature", + "AUTOGEN_LLM_TOP_P": "top_p", + } + + # Mapping from file keys to model config keys + KEY_MAPPING_FILE: dict[str, str] = { + "model_name": "model", + "model_api_key": "api_key", + "model_base_url": "base_url", + "model_api_type": "api_type", + } + + def __init__(self, env_file_path: str = ".env", llm_config: dict[str,Any] | None = None) -> None: + load_dotenv(env_file_path, verbose=True, override=True) + if llm_config: + self.config: dict[str, Any] = self.load_config_from_api(llm_config) + else: + self.config: dict[str, Any] = self._load_config() + + + def _load_config(self) -> dict[str, Any]: + config_file = os.getenv("AGENTS_LLM_CONFIG_FILE") + config_file_ref_key = os.getenv("AGENTS_LLM_CONFIG_FILE_REF_KEY") + + if config_file: + try: + with open(config_file, 'r') as file: # noqa: UP015 + file_config = json.load(file) + + if config_file_ref_key: + if config_file_ref_key in file_config: + logger.info(f"Loading configuration from: {config_file} with key: {config_file_ref_key}") + raw_config = file_config[config_file_ref_key] + + # Process configurations for both planner_agent and browser_nav_agent + planner_config = self._normalize_config(raw_config.get("planner_agent", {})) + browser_nav_config = self._normalize_config(raw_config.get("browser_nav_agent", {})) + + config = { + "planner_agent": planner_config, + "browser_nav_agent": browser_nav_config, + "other_settings": {k: v for k, v in raw_config.items() if k not in ["planner_agent", "browser_nav_agent"]}, + } + logger.info(f"Using configuration key '{config_file_ref_key}' from the config file.") + else: + logger.error(f"Key '{config_file_ref_key}' not found in the configuration file.") + raise KeyError(f"Key '{config_file_ref_key}' not found in the configuration file.") + else: + logger.error("AGENTS_LLM_CONFIG_FILE_REF_KEY is not provided.") + raise ValueError("AGENTS_LLM_CONFIG_FILE_REF_KEY must be provided if AGENTS_LLM_CONFIG_FILE is set.") + + except Exception as e: + logger.error(f"Error loading configuration file: {e}") + raise e + else: + logger.info("Loading configuration from environment variables") + # Load configurations from environment variables + normalized_config = self._normalize_config_from_env() + + config = { + "planner_agent": normalized_config, + "browser_nav_agent": normalized_config + } + + return config + + def load_config_from_api(self, llm_config: dict[str, Any]) -> dict[str, Any]: + """ + Load configuration from a JSON provided during execution. + + Parameters + ---------- + config_string : dict[str,Any] + A JSON representing the configuration. + + Returns + ------- + dict[str, Any] + The loaded and normalized configuration. + """ + try: + + logger.info("Loading LLM configuration provided via API.") + + # Process configurations for both planner_agent and browser_nav_agent + planner_config = self._normalize_config(llm_config.get("planner_agent", {})) + browser_nav_config = self._normalize_config(llm_config.get("browser_nav_agent", {})) + + config = { + "planner_agent": planner_config, + "browser_nav_agent": browser_nav_config, + "other_settings": {k: v for k, v in llm_config.items() if k not in ["planner_agent", "browser_nav_agent"]}, + } + + return config + + except json.JSONDecodeError as e: + logger.error(f"Error decoding JSON string: {e}") + raise e + + def _normalize_config(self, agent_config: dict[str, Any]) -> dict[str, Any]: + """Normalize agent-specific config from a file, grouping keys into model_config_params, llm_config_params, and other_settings.""" + model_config = {} + llm_config_params = {} + other_settings = {} + + for k, v in agent_config.items(): + if k in self.KEY_MAPPING_FILE: + model_config[self.KEY_MAPPING_FILE[k]] = v + elif k == "llm_config_params": + llm_config_params = v # Keep llm_config_params as is + else: + other_settings[k] = v + + return { + "model_config_params": model_config, + "llm_config_params": llm_config_params, + "other_settings": other_settings, + } + + def _normalize_config_from_env(self) -> dict[str, Any]: + """Normalize config from environment variables, adding defaults for 'temperature', 'top_p', and 'seed' based on model name.""" + model_config = {} + llm_config_params = {} + other_settings = {} + + # Populate model_config_params + for original_key, mapped_key in self.KEY_MAPPING_ENV_MODEL.items(): + value = os.getenv(original_key) + if value is not None: + model_config[mapped_key] = value + + # Populate llm_config_params + for original_key, mapped_key in self.KEY_MAPPING_ENV_LLM.items(): + value = os.getenv(original_key) + if value is not None: + llm_config_params[mapped_key] = value + + # Capture other settings that start with 'AUTOGEN_MODEL' + for original_key in os.environ: + if original_key.startswith("AUTOGEN_MODEL") and original_key not in self.KEY_MAPPING_ENV_MODEL: + other_settings[original_key] = os.getenv(original_key) + + # Apply defaults for 'temperature', 'top_p', 'seed' if not present + model_name:str = model_config.get("model", "").lower() # type: ignore + + if model_name.startswith("gpt"): # type: ignore + llm_config_params.setdefault("temperature", 0.0) # type: ignore + llm_config_params.setdefault("top_p", 0.001) # type: ignore + llm_config_params.setdefault("seed", 12345) # type: ignore + else: + llm_config_params.setdefault("temperature", 0.1) # type: ignore + llm_config_params.setdefault("top_p", 0.1) # type: ignore + + return { + "model_config_params": model_config, + "llm_config_params": llm_config_params, + "other_settings": other_settings, + } + + def get_planner_agent_config(self) -> dict[str, Any]: + return self.config["planner_agent"] + + def get_browser_nav_agent_config(self) -> dict[str, Any]: + return self.config["browser_nav_agent"] + + def get_full_config(self) -> dict[str, Any]: + return self.config + +# Example usage +if __name__ == "__main__": + config = AgentsLLMConfig() + + planner_config = config.get_planner_agent_config() + browser_nav_config = config.get_browser_nav_agent_config() diff --git a/Agent_E/ae/core/autogen_wrapper.py b/Agent_E/ae/core/autogen_wrapper.py new file mode 100644 index 0000000..d54e757 --- /dev/null +++ b/Agent_E/ae/core/autogen_wrapper.py @@ -0,0 +1,384 @@ +import asyncio +import json +import os +import tempfile +import traceback +from string import Template +from time import time_ns +from typing import Any + +import autogen # type: ignore +import nest_asyncio # type: ignore +import openai + +#from autogen import Cache +from Agent_E.ae.config import SOURCE_LOG_FOLDER_PATH +from Agent_E.ae.core.agents.browser_nav_agent import BrowserNavAgent +from Agent_E.ae.core.agents.high_level_planner_agent import PlannerAgent +from Agent_E.ae.core.post_process_responses import final_reply_callback_planner_agent as notify_planner_messages # type: ignore +from Agent_E.ae.core.prompts import LLM_PROMPTS +from Agent_E.ae.core.skills.get_url import geturl +from Agent_E.ae.utils.autogen_sequential_function_call import UserProxyAgent_SequentialFunctionExecution +from Agent_E.ae.utils.detect_llm_loops import is_agent_stuck_in_loop +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.response_parser import parse_response +from Agent_E.ae.utils.ui_messagetype import MessageType + +nest_asyncio.apply() # type: ignore + +class AutogenWrapper: + """ + A wrapper class for interacting with the Autogen library. + + Args: + planner_max_chat_round (int): The maximum number of chat rounds for the planner agent. + browser_nav_max_chat_round (int): The maximum number of chat rounds for the browser navigation agent. + + Attributes: + number_of_rounds (int): The maximum number of chat rounds. + agents_map (dict): A dictionary of the agents that are instantiated in this autogen instance. + + """ + + def __init__(self, save_chat_logs_to_files: bool = True, planner_max_chat_round: int = 50, browser_nav_max_chat_round: int = 10): + self.planner_number_of_rounds = planner_max_chat_round + self.browser_number_of_rounds = browser_nav_max_chat_round + + self.agents_map: dict[str, UserProxyAgent_SequentialFunctionExecution | autogen.AssistantAgent | autogen.ConversableAgent ] | None = None + + self.planner_agent_model_config : list[dict[str, str]] | None = None + self.browser_nav_agent_model_config : list[dict[str, str]] | None = None + + self.planner_agent_config: dict[str, Any] | None = None + self.browser_nav_agent_config: dict[str, Any] | None = None + + self.chat_logs_dir: str = SOURCE_LOG_FOLDER_PATH + self.save_chat_logs_to_files = save_chat_logs_to_files + + @classmethod + async def create(cls, planner_agent_config: dict[str, Any], browser_nav_agent_config: dict[str, Any], agents_needed: list[str] | None = None, + save_chat_logs_to_files: bool = True, planner_max_chat_round: int = 50, browser_nav_max_chat_round: int = 10): + """ + Create an instance of AutogenWrapper. + + Args: + planner_agent_config: dict[str, Any]: A dictionary containing the configuration parameters for the planner agent. For example: + { + "model_name": "gpt-4o", + "model_api_key": "", + "model_base_url": null, + "system_prompt": ["optional prompt unless you want to use the built in"], + "llm_config_params": { #all name value pairs here will go to the llm config of autogen verbatim + "cache_seed": null, + "temperature": 0.001, + "top_p": 0.001 + } + } + browser_nav_agent_config: dict[str, Any]: A dictionary containing the configuration parameters for the browser navigation agent. Same format as planner_agent_config. + agents_needed (list[str], optional): The list of agents needed. If None, then ["user", "browser_nav_executor", "planner_agent", "browser_nav_agent"] will be used. + save_chat_logs_to_files (bool, optional): Whether to save chat logs to files. Defaults to True. + planner_max_chat_rounds (int, optional): The maximum number of chat rounds for the planner. Defaults to 50. + browser_nav_max_chat_round (int, optional): The maximum number of chat rounds for the browser navigation agent. Defaults to 10. + + Returns: + AutogenWrapper: An instance of AutogenWrapper. + + """ + print(f">>> Creating AutogenWrapper with {agents_needed}, Planner max chat rounds: {planner_max_chat_round}, browser nav max chat rounds: {browser_nav_max_chat_round}. Save chat logs to files: {save_chat_logs_to_files}") + if agents_needed is None: + agents_needed = ["user", "browser_nav_executor", "planner_agent", "browser_nav_agent"] + # Create an instance of cls + self = cls(save_chat_logs_to_files=save_chat_logs_to_files, planner_max_chat_round=planner_max_chat_round, browser_nav_max_chat_round=browser_nav_max_chat_round) + + os.environ["AUTOGEN_USE_DOCKER"] = "False" + + self.planner_agent_config = planner_agent_config + self.browser_nav_agent_config = browser_nav_agent_config + + self.planner_agent_model_config = self.convert_model_config_to_autogen_format(self.planner_agent_config["model_config_params"]) + self.browser_nav_agent_model_config = self.convert_model_config_to_autogen_format(self.browser_nav_agent_config["model_config_params"]) + + self.agents_map = await self.__initialize_agents(agents_needed) + + def trigger_nested_chat(manager: autogen.ConversableAgent): + content:str=manager.last_message()["content"] # type: ignore + content_json = parse_response(content) # type: ignore + next_step = content_json.get('next_step', None) + plan = content_json.get('plan', None) + if plan is not None: + notify_planner_messages(plan, message_type=MessageType.PLAN) + + if next_step is None: + notify_planner_messages("Received no response, terminating..", message_type=MessageType.INFO) # type: ignore + return False + else: + notify_planner_messages(next_step, message_type=MessageType.STEP) # type: ignore + return True + + def get_url() -> str: + return asyncio.run(geturl()) + + def my_custom_summary_method(sender: autogen.ConversableAgent,recipient: autogen.ConversableAgent, summary_args: dict ) : # type: ignore + messages_str_keys = {str(key): value for key, value in sender.chat_messages.items()} # type: ignore + self.__save_chat_log(list(messages_str_keys.values())[0]) # type: ignore + last_message=recipient.last_message(sender)["content"] # type: ignore + if not last_message or last_message.strip() == "": # type: ignore + # print(f">>> Last message from browser nav was empty. Max turns: {self.browser_number_of_rounds*2}, number of messages: {len(list(sender.chat_messages.items())[0][1])}") + # print(">>> Sender messages:", json.dumps( list(sender.chat_messages.items())[0][1], indent=2)) + return "I received an empty message. This is not an error and is recoverable. Try to reformulate the task..." + elif "##TERMINATE TASK##" in last_message: + last_message=last_message.replace("##TERMINATE TASK##", "") # type: ignore + last_message=last_message+" "+ get_url() # type: ignore + notify_planner_messages(last_message, message_type=MessageType.ACTION) # type: ignore + return last_message # type: ignore + return recipient.last_message(sender)["content"] # type: ignore + + def reflection_message(recipient, messages, sender, config): # type: ignore + last_message=messages[-1]["content"] # type: ignore + content_json = parse_response(last_message) # type: ignore + next_step = content_json.get('next_step', None) + + if next_step is None: + print ("Message to nested chat returned None") + return None + else: + next_step = next_step.strip() +" " + get_url() # type: ignore + return next_step # type: ignore + + # print(f">>> Registering nested chat. Available agents: {self.agents_map}") + self.agents_map["user"].register_nested_chats( # type: ignore + [ + { + "sender": self.agents_map["browser_nav_executor"], + "recipient": self.agents_map["browser_nav_agent"], + "message":reflection_message, + "max_turns": self.browser_number_of_rounds, + "summary_method": my_custom_summary_method, + } + ], + trigger=trigger_nested_chat, # type: ignore + ) + + return self + + + def convert_model_config_to_autogen_format(self, model_config: dict[str, str]) -> list[dict[str, Any]]: + env_var: list[dict[str, str]] = [model_config] + with tempfile.NamedTemporaryFile(delete=False, mode='w') as temp: + json.dump(env_var, temp) + temp_file_path = temp.name + + return autogen.config_list_from_json(env_or_file=temp_file_path) + + def get_chat_logs_dir(self) -> str|None: + """ + Get the directory for saving chat logs. + + Returns: + str|None: The directory path or None if there is not one + + """ + return self.chat_logs_dir + + def set_chat_logs_dir(self, chat_logs_dir: str): + """ + Set the directory for saving chat logs. + + Args: + chat_logs_dir (str): The directory path. + + """ + self.chat_logs_dir = chat_logs_dir + + + def __save_chat_log(self, chat_log: list[dict[str, Any]]): + if not self.save_chat_logs_to_files: + logger.info("Nested chat logs", extra={"nested_chat_log": chat_log}) + else: + chat_logs_file = os.path.join(self.get_chat_logs_dir() or "", f"nested_chat_log_{str(time_ns())}.json") + # Save the chat log to a file + with open(chat_logs_file, "w") as file: + json.dump(chat_log, file, indent=4) + + + async def __initialize_agents(self, agents_needed: list[str]): + """ + Instantiate all agents with their appropriate prompts/skills. + + Args: + agents_needed (list[str]): The list of agents needed, this list must have user_proxy in it or an error will be generated. + + Returns: + dict: A dictionary of agent instances. + + """ + agents_map: dict[str, UserProxyAgent_SequentialFunctionExecution | autogen.ConversableAgent]= {} + + user_delegate_agent = await self.__create_user_delegate_agent() + agents_map["user"] = user_delegate_agent + agents_needed.remove("user") + + browser_nav_executor = self.__create_browser_nav_executor_agent() + agents_map["browser_nav_executor"] = browser_nav_executor + agents_needed.remove("browser_nav_executor") + + for agent_needed in agents_needed: + if agent_needed == "browser_nav_agent": + browser_nav_agent: autogen.ConversableAgent = self.__create_browser_nav_agent(agents_map["browser_nav_executor"] ) + agents_map["browser_nav_agent"] = browser_nav_agent + elif agent_needed == "planner_agent": + planner_agent = self.__create_planner_agent(user_delegate_agent) + agents_map["planner_agent"] = planner_agent + else: + raise ValueError(f"Unknown agent type: {agent_needed}") + return agents_map + + + async def __create_user_delegate_agent(self) -> autogen.ConversableAgent: + """ + Create a ConversableAgent instance. + + Returns: + autogen.ConversableAgent: An instance of ConversableAgent. + + """ + def is_planner_termination_message(x: dict[str, str])->bool: # type: ignore + should_terminate = False + function: Any = x.get("function", None) + if function is not None: + return False + + content:Any = x.get("content", "") + if content is None: + content = "" + should_terminate = True + else: + try: + content_json = parse_response(content) + _terminate = content_json.get('terminate', "no") + final_response = content_json.get('final_response', None) + if(_terminate == "yes"): + should_terminate = True + if final_response: + notify_planner_messages(final_response, message_type=MessageType.ANSWER) + except json.JSONDecodeError: + logger.error("Error decoding JSON response:\n{content}.\nTerminating..") + should_terminate = True + + return should_terminate # type: ignore + + task_delegate_agent = UserProxyAgent_SequentialFunctionExecution( + name="user", + llm_config=False, + system_message=LLM_PROMPTS["USER_AGENT_PROMPT"], + is_termination_msg=is_planner_termination_message, # type: ignore + human_input_mode="NEVER", + max_consecutive_auto_reply=self.planner_number_of_rounds, + ) + return task_delegate_agent + + def __create_browser_nav_executor_agent(self): + """ + Create a UserProxyAgent instance for executing browser control. + + Returns: + autogen.UserProxyAgent: An instance of UserProxyAgent. + + """ + def is_browser_executor_termination_message(x: dict[str, str])->bool: # type: ignore + + tools_call:Any = x.get("tool_calls", "") + if tools_call : + chat_messages=self.agents_map["browser_nav_executor"].chat_messages #type: ignore + # Get the only key from the dictionary + agent_key = next(iter(chat_messages)) # type: ignore + # Get the chat messages corresponding to the only key + messages = chat_messages[agent_key] # type: ignore + return is_agent_stuck_in_loop(messages) # type: ignore + else: + print("Terminating browser executor") + return True + + browser_nav_executor_agent = UserProxyAgent_SequentialFunctionExecution( + name="browser_nav_executor", + is_termination_msg=is_browser_executor_termination_message, + human_input_mode="NEVER", + llm_config=None, + max_consecutive_auto_reply=self.browser_number_of_rounds, + code_execution_config={ + "last_n_messages": 1, + "work_dir": "tasks", + "use_docker": False, + }, + ) + print(">>> Created browser_nav_executor_agent:", browser_nav_executor_agent) + return browser_nav_executor_agent + + def __create_browser_nav_agent(self, user_proxy_agent: UserProxyAgent_SequentialFunctionExecution) -> autogen.ConversableAgent: + """ + Create a BrowserNavAgent instance. + + Args: + user_proxy_agent (autogen.UserProxyAgent): The instance of UserProxyAgent that was created. + + Returns: + autogen.AssistantAgent: An instance of BrowserNavAgent. + + """ + browser_nav_agent = BrowserNavAgent(self.browser_nav_agent_model_config, self.browser_nav_agent_config["llm_config_params"], # type: ignore + self.browser_nav_agent_config["other_settings"].get("system_prompt", None), user_proxy_agent) # type: ignore + #print(">>> browser agent tools:", json.dumps(browser_nav_agent.agent.llm_config.get("tools"), indent=2)) + return browser_nav_agent.agent + + def __create_planner_agent(self, assistant_agent: autogen.ConversableAgent): + """ + Create a Planner Agent instance. This is mainly used for exploration at this point + + Returns: + autogen.AssistantAgent: An instance of PlannerAgent. + + """ + planner_agent = PlannerAgent(self.planner_agent_model_config, self.planner_agent_config["llm_config_params"], # type: ignore + self.planner_agent_config["other_settings"].get("system_prompt", None), assistant_agent) # type: ignore + return planner_agent.agent + + async def process_command(self, command: str, current_url: str | None = None) -> autogen.ChatResult | None: + """ + Process a command by sending it to one or more agents. + + Args: + command (str): The command to be processed. + current_url (str, optional): The current URL of the browser. Defaults to None. + + Returns: + autogen.ChatResult | None: The result of the command processing, or None if an error occurred. Contains chat log, cost(tokens/price) + + """ + current_url_prompt_segment = "" + if current_url: + current_url_prompt_segment = f"Current Page: {current_url}" + + prompt = Template(LLM_PROMPTS["COMMAND_EXECUTION_PROMPT"]).substitute(command=command, current_url_prompt_segment=current_url_prompt_segment) + logger.info(f"Prompt for command: {prompt}") + #with Cache.disk() as cache: + try: + if self.agents_map is None: + raise ValueError("Agents map is not initialized.") + + result=await self.agents_map["user"].a_initiate_chat( # type: ignore + self.agents_map["planner_agent"], # self.manager # type: ignore + max_turns=self.planner_number_of_rounds, + #clear_history=True, + message=prompt, + silent=False, + cache=None, + ) + # reset usage summary for all agents after each command + for agent in self.agents_map.values(): + if hasattr(agent, "client") and agent.client is not None: + agent.client.clear_usage_summary() # type: ignore + return result + except openai.BadRequestError as bre: + logger.error(f"Unable to process command: \"{command}\". {bre}") + traceback.print_exc() + diff --git a/Agent_E/ae/core/memory/static_ltm.py b/Agent_E/ae/core/memory/static_ltm.py new file mode 100644 index 0000000..a53711a --- /dev/null +++ b/Agent_E/ae/core/memory/static_ltm.py @@ -0,0 +1,22 @@ +import os + +from Agent_E.ae.config import USER_PREFERENCES_PATH +from Agent_E.ae.utils.logger import logger + + +def get_user_ltm(): + """ + Get the user preferences stored in the user_preferences.txt file. + returns: str | None - The user preferences stored in the user_preferences.txt file or None if not found. + """ + user_preferences_file_name = 'user_preferences.txt' + user_preferences_file = os.path.join(USER_PREFERENCES_PATH, user_preferences_file_name) + try: + with open(user_preferences_file) as f: + user_pref = f.read() + logger.info(f"User preferences loaded from: {user_preferences_file}") + return user_pref + except FileNotFoundError: + logger.warning(f"""User preferences file \"{user_preferences_file_name}\" not found. +To add your preferences for this agent to use, create a file called "{user_preferences_file_name}" in directory "{USER_PREFERENCES_PATH}".\n""") + return None diff --git a/Agent_E/ae/core/notification_manager.py b/Agent_E/ae/core/notification_manager.py new file mode 100644 index 0000000..7d5f0d5 --- /dev/null +++ b/Agent_E/ae/core/notification_manager.py @@ -0,0 +1,53 @@ +from collections.abc import Callable + + +class NotificationManager: + """ + NotificationManager handles the dispatching of notifications to registered listeners. + + Attributes: + listeners (list[Callable[[dict[str, str]], None]]): A list of listener callbacks to notify. + """ + + def __init__(self): + """ + Initialize the NotificationManager with no listeners. + """ + self.listeners: list[Callable[[dict[str, str]], None]] = [] + + def notify(self, message: str, message_type: str) -> None: + """ + Notify all registered listeners with a message and its type. + + Args: + message (str): The message to notify. + message_type (str): The type of the message. + """ + notification = { + "message": message, + "type": message_type, + } + + if self.listeners: + for listener in self.listeners: + listener(notification) + else: + print(f"No listeners available, discarding message: {notification}") + + def register_listener(self, listener: Callable[[dict[str, str]], None]) -> None: + """ + Register a new listener to receive notifications. + + Args: + listener (Callable[[dict[str, str]], None]): The listener callback to register. + """ + self.listeners.append(listener) + + def unregister_listener(self, listener: Callable[[dict[str, str]], None]) -> None: + """ + Unregister a listener from receiving notifications. + + Args: + listener (Callable[[dict[str, str]], None]): The listener callback to unregister. + """ + self.listeners.remove(listener) diff --git a/Agent_E/ae/core/playwright_manager.py b/Agent_E/ae/core/playwright_manager.py new file mode 100644 index 0000000..4a2106b --- /dev/null +++ b/Agent_E/ae/core/playwright_manager.py @@ -0,0 +1,452 @@ +import asyncio +import os +import tempfile +import time + +from playwright.async_api import async_playwright as playwright +from playwright.async_api import BrowserContext +from playwright.async_api import Page +from playwright.async_api import Playwright + +from Agent_E.ae.core.notification_manager import NotificationManager +from Agent_E.ae.core.ui_manager import UIManager +from Agent_E.ae.utils.dom_mutation_observer import dom_mutation_change_detected +from Agent_E.ae.utils.dom_mutation_observer import handle_navigation_for_mutation_observer +from Agent_E.ae.utils.js_helper import beautify_plan_message +from Agent_E.ae.utils.js_helper import escape_js_message +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + +# Enusres that playwright does not wait for font loading when taking screenshots. Reference: https://github.com/microsoft/playwright/issues/28995 +os.environ["PW_TEST_SCREENSHOT_NO_FONTS_READY"] = "1" + +class PlaywrightManager: + """ + A singleton class to manage Playwright instances and browsers. + + Attributes: + browser_type (str): The type of browser to use ('chromium', 'firefox', 'webkit'). + isheadless (bool): Flag to launch the browser in headless mode or not. + + The class ensures only one instance of itself, Playwright, and the browser is created during the application lifecycle. + """ + _homepage = "https://www.google.com" + _instance = None + _playwright = None # type: ignore + _browser_context = None + __async_initialize_done = False + _take_screenshots = False + _screenshots_dir = None + + def __new__(cls, *args, **kwargs): # type: ignore + """ + Ensures that only one instance of PlaywrightManager is created (singleton pattern). + """ + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance.__initialized = False + logger.debug("Playwright instance created..") + return cls._instance + + + def __init__(self, browser_type: str = "chromium", headless: bool = False, gui_input_mode: bool = True, screenshots_dir: str = "", take_screenshots: bool = False): + """ + Initializes the PlaywrightManager with the specified browser type and headless mode. + Initialization occurs only once due to the singleton pattern. + + Args: + browser_type (str, optional): The type of browser to use. Defaults to "chromium". + headless (bool, optional): Flag to launch the browser in headless mode or not. Defaults to False (non-headless). + """ + if self.__initialized: + return + self.browser_type = browser_type + self.isheadless = headless + self.__initialized = True + self.notification_manager = NotificationManager() + self.user_response_event = asyncio.Event() + if gui_input_mode: + self.ui_manager: UIManager = UIManager() + + self.set_take_screenshots(take_screenshots) + self.set_screenshots_dir(screenshots_dir) + + + async def async_initialize(self): + """ + Asynchronously initialize necessary components and handlers for the browser context. + """ + if self.__async_initialize_done: + return + + # Step 1: Ensure Playwright is started and browser context is created + await self.start_playwright() + await self.ensure_browser_context() + + # Step 2: Deferred setup of handlers + await self.setup_handlers() + + # Step 3: Navigate to homepage + await self.go_to_homepage() + + self.__async_initialize_done = True + + + async def ensure_browser_context(self): + """ + Ensure that a browser context exists, creating it if necessary. + """ + if self._browser_context is None: + await self.create_browser_context() + + + async def setup_handlers(self): + """ + Setup various handlers after the browser context has been ensured. + """ + await self.set_overlay_state_handler() + await self.set_user_response_handler() + await self.set_navigation_handler() + + + async def start_playwright(self): + """ + Starts the Playwright instance if it hasn't been started yet. This method is idempotent. + """ + if not PlaywrightManager._playwright: + PlaywrightManager._playwright: Playwright = await playwright().start() + + + async def stop_playwright(self): + """ + Stops the Playwright instance and resets it to None. This method should be called to clean up resources. + """ + # Close the browser context if it's initialized + if PlaywrightManager._browser_context is not None: + await PlaywrightManager._browser_context.close() + PlaywrightManager._browser_context = None + + # Stop the Playwright instance if it's initialized + if PlaywrightManager._playwright is not None: # type: ignore + await PlaywrightManager._playwright.stop() + PlaywrightManager._playwright = None # type: ignore + + + async def create_browser_context(self): + user_dir:str = os.environ.get('BROWSER_STORAGE_DIR', '') + if self.browser_type == "chromium": + logger.info(f"User dir: {user_dir}") + try: + PlaywrightManager._browser_context = await PlaywrightManager._playwright.chromium.launch_persistent_context(user_dir, + channel= "chrome", headless=self.isheadless, + args=["--disable-blink-features=AutomationControlled", + "--disable-session-crashed-bubble", # disable the restore session bubble + "--disable-infobars", # disable informational popups, + ], + no_viewport=True + ) + except Exception as e: + if "Target page, context or browser has been closed" in str(e): + new_user_dir = tempfile.mkdtemp() + logger.error(f"Failed to launch persistent context with user dir {user_dir}: {e} Trying to launch with a new user dir {new_user_dir}") + PlaywrightManager._browser_context = await PlaywrightManager._playwright.chromium.launch_persistent_context(new_user_dir, + channel= "chrome", headless=self.isheadless, + args=["--disable-blink-features=AutomationControlled", + "--disable-session-crashed-bubble", # disable the restore session bubble + "--disable-infobars", # disable informational popups, + ], + no_viewport=True + ) + elif "Chromium distribution 'chrome' is not found " in str(e): + raise ValueError("Chrome is not installed on this device. Install Google Chrome or install playwright using 'playwright install chrome'. Refer to the readme for more information.") from None + else: + raise e from None + else: + raise ValueError(f"Unsupported browser type: {self.browser_type}") + + + async def get_browser_context(self): + """ + Returns the existing browser context, or creates a new one if it doesn't exist. + """ + await self.ensure_browser_context() + return self._browser_context + + + async def get_current_url(self) -> str | None: + """ + Get the current URL of current page + + Returns: + str | None: The current URL if any. + """ + try: + current_page: Page =await self.get_current_page() + return current_page.url + except Exception: + pass + return None + + async def get_current_page(self) -> Page : + """ + Get the current page of the browser + + Returns: + Page: The current page if any. + """ + try: + browser: BrowserContext = await self.get_browser_context() # type: ignore + # Filter out closed pages + pages: list[Page] = [page for page in browser.pages if not page.is_closed()] + page: Page | None = pages[-1] if pages else None + logger.debug(f"Current page: {page.url if page else None}") + if page is not None: + return page + else: + page:Page = await browser.new_page() # type: ignore + return page + except Exception: + logger.warn("Browser context was closed. Creating a new one.") + PlaywrightManager._browser_context = None + _browser:BrowserContext= await self.get_browser_context() # type: ignore + page: Page | None = await self.get_current_page() + return page + + + async def close_all_tabs(self, keep_first_tab: bool = True): + """ + Closes all tabs in the browser context, except for the first tab if `keep_first_tab` is set to True. + + Args: + keep_first_tab (bool, optional): Whether to keep the first tab open. Defaults to True. + """ + browser_context = await self.get_browser_context() + pages: list[Page] = browser_context.pages #type: ignore + pages_to_close: list[Page] = pages[1:] if keep_first_tab else pages # type: ignore + for page in pages_to_close: # type: ignore + await page.close() # type: ignore + + + async def close_except_specified_tab(self, page_to_keep: Page): + """ + Closes all tabs in the browser context, except for the specified tab. + + Args: + page_to_keep (Page): The Playwright page object representing the tab that should remain open. + """ + browser_context = await self.get_browser_context() + for page in browser_context.pages: # type: ignore + if page != page_to_keep: # Check if the current page is not the one to keep + await page.close() # type: ignore + + + async def go_to_homepage(self): + page:Page = await PlaywrightManager.get_current_page(self) + await page.goto(self._homepage) + + + async def set_navigation_handler(self): + page:Page = await PlaywrightManager.get_current_page(self) + page.on("domcontentloaded", self.ui_manager.handle_navigation) # type: ignore + page.on("domcontentloaded", handle_navigation_for_mutation_observer) # type: ignore + await page.expose_function("dom_mutation_change_detected", dom_mutation_change_detected) # type: ignore + + async def set_overlay_state_handler(self): + logger.debug("Setting overlay state handler") + context = await self.get_browser_context() + await context.expose_function('overlay_state_changed', self.overlay_state_handler) # type: ignore + await context.expose_function('show_steps_state_changed',self.show_steps_state_handler) # type: ignore + + async def overlay_state_handler(self, is_collapsed: bool): + page = await self.get_current_page() + self.ui_manager.update_overlay_state(is_collapsed) + if not is_collapsed: + await self.ui_manager.update_overlay_chat_history(page) + + async def show_steps_state_handler(self, show_details: bool): + page = await self.get_current_page() + await self.ui_manager.update_overlay_show_details(show_details, page) + + async def set_user_response_handler(self): + context = await self.get_browser_context() + await context.expose_function('user_response', self.receive_user_response) # type: ignore + + + async def notify_user(self, message: str, message_type: MessageType = MessageType.STEP): + """ + Notify the user with a message. + + Args: + message (str): The message to notify the user with. + message_type (enum, optional): Values can be 'PLAN', 'QUESTION', 'ANSWER', 'INFO', 'STEP'. Defaults to 'STEP'. + To Do: Convert to Enum. + """ + + if message.startswith(":"): + message = message[1:] + + if message.endswith(","): + message = message[:-1] + + if message_type == MessageType.PLAN: + message = beautify_plan_message(message) + message = "Plan:\n" + message + elif message_type == MessageType.STEP: + if "confirm" in message.lower(): + message = "Verify: " + message + else: + message = "Next step: " + message + elif message_type == MessageType.QUESTION: + message = "Question: " + message + elif message_type == MessageType.ANSWER: + message = "Response: " + message + + safe_message = escape_js_message(message) + self.ui_manager.new_system_message(safe_message, message_type) + + if self.ui_manager.overlay_show_details == False: # noqa: E712 + if message_type not in (MessageType.PLAN, MessageType.QUESTION, MessageType.ANSWER, MessageType.INFO): + return + + if self.ui_manager.overlay_show_details == True: # noqa: E712 + if message_type not in (MessageType.PLAN, MessageType.QUESTION , MessageType.ANSWER, MessageType.INFO, MessageType.STEP): + return + + safe_message_type = escape_js_message(message_type.value) + try: + js_code = f"addSystemMessage({safe_message}, is_awaiting_user_response=false, message_type={safe_message_type});" + page = await self.get_current_page() + await page.evaluate(js_code) + except Exception as e: + logger.error(f"Failed to notify user with message \"{message}\". However, most likey this will work itself out after the page loads: {e}") + + self.notification_manager.notify(message, message_type.value) + + async def highlight_element(self, selector: str, add_highlight: bool): + try: + page: Page = await self.get_current_page() + if add_highlight: + # Add the 'agente-ui-automation-highlight' class to the element. This class is used to apply the fading border. + await page.eval_on_selector(selector, '''e => { + let originalBorderStyle = e.style.border; + e.classList.add('agente-ui-automation-highlight'); + e.addEventListener('animationend', () => { + e.classList.remove('agente-ui-automation-highlight') + });}''') + logger.debug(f"Applied pulsating border to element with selector {selector} to indicate text entry operation") + else: + # Remove the 'agente-ui-automation-highlight' class from the element. + await page.eval_on_selector(selector, "e => e.classList.remove('agente-ui-automation-highlight')") + logger.debug(f"Removed pulsating border from element with selector {selector} after text entry operation") + except Exception: + # This is not significant enough to fail the operation + pass + + async def receive_user_response(self, response: str): + self.user_response = response # Store the response for later use. + logger.debug(f"Received user response to system prompt: {response}") + # Notify event loop that the user's response has been received. + self.user_response_event.set() + + + async def prompt_user(self, message: str) -> str: + """ + Prompt the user with a message and wait for a response. + + Args: + message (str): The message to prompt the user with. + + Returns: + str: The user's response. + """ + logger.debug(f"Prompting user with message: \"{message}\"") + #self.ui_manager.new_system_message(message) + + page = await self.get_current_page() + + await self.ui_manager.show_overlay(page) + self.log_system_message(message, MessageType.QUESTION) # add the message to history after the overlay is opened to avoid double adding it. add_system_message below will add it + + safe_message = escape_js_message(message) + + js_code = f"addSystemMessage({safe_message}, is_awaiting_user_response=true, message_type='question');" + await page.evaluate(js_code) + + await self.user_response_event.wait() + result = self.user_response + logger.info(f"User prompt reponse to \"{message}\": {result}") + self.user_response_event.clear() + self.user_response = "" + self.ui_manager.new_user_message(result) + return result + + def set_take_screenshots(self, take_screenshots: bool): + self._take_screenshots = take_screenshots + + def get_take_screenshots(self): + return self._take_screenshots + + def set_screenshots_dir(self, screenshots_dir: str): + self._screenshots_dir = screenshots_dir + + def get_screenshots_dir(self): + return self._screenshots_dir + + async def take_screenshots(self, name: str, page: Page|None, full_page: bool = True, include_timestamp: bool = True, + load_state: str = 'domcontentloaded', take_snapshot_timeout: int = 5*1000): + if not self._take_screenshots: + return + if page is None: + page = await self.get_current_page() + + screenshot_name = name + + if include_timestamp: + screenshot_name = f"{int(time.time_ns())}_{screenshot_name}" + screenshot_name += ".png" + screenshot_path = f"{self.get_screenshots_dir()}/{screenshot_name}" + try: + await page.wait_for_load_state(state=load_state, timeout=take_snapshot_timeout) # type: ignore + await page.screenshot(path=screenshot_path, full_page=full_page, timeout=take_snapshot_timeout, caret="initial", scale="device") + logger.debug(f"Screen shot saved to: {screenshot_path}") + except Exception as e: + logger.error(f"Failed to take screenshot and save to \"{screenshot_path}\". Error: {e}") + + + def log_user_message(self, message: str): + """ + Log the user's message. + + Args: + message (str): The user's message to log. + """ + self.ui_manager.new_user_message(message) + + + def log_system_message(self, message: str, type: MessageType = MessageType.STEP): + """ + Log a system message. + + Args: + message (str): The system message to log. + """ + self.ui_manager.new_system_message(message, type) + + async def update_processing_state(self, processing_state: str): + """ + Update the processing state of the overlay. + + Args: + is_processing (str): "init", "processing", "done" + """ + page = await self.get_current_page() + + await self.ui_manager.update_processing_state(processing_state, page) + + async def command_completed(self, command: str, elapsed_time: float | None = None): + """ + Notify the overlay that the command has been completed. + """ + logger.debug(f"Command \"{command}\" has been completed. Focusing on the overlay input if it is open.") + page = await self.get_current_page() + await self.ui_manager.command_completed(page, command, elapsed_time) diff --git a/Agent_E/ae/core/post_process_responses.py b/Agent_E/ae/core/post_process_responses.py new file mode 100644 index 0000000..907c9de --- /dev/null +++ b/Agent_E/ae/core/post_process_responses.py @@ -0,0 +1,43 @@ +import asyncio +from typing import Any + +import autogen # type: ignore + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +def final_reply_callback_user_proxy(recipient: autogen.ConversableAgent, messages: list[dict[str, Any]], sender: autogen.Agent, config: dict[str, Any]): + """ + Callback function that is called each time the user proxy agent receives a message. + It picks the last message from the list of messages and checks if it contains the termination signal. + If the termination signal is found, it extracts the final response and outputs it. + + Args: + recipient (autogen.ConversableAgent): The recipient of the message. + messages (Optional[list[dict[str, Any]]]): The list of messages received by the agent. + sender (Optional[autogen.Agent]): The sender of the message. + config (Optional[Any]): Additional configuration parameters. + + Returns: + Tuple[bool, None]: A tuple indicating whether the processing should stop and the response to be sent. + """ + global last_agent_response + last_message = messages[-1] + logger.debug(f"Post Process Message (User Proxy):{last_message}") + if last_message.get('content') and "##TERMINATE##" in last_message['content']: + last_agent_response = last_message['content'].replace("##TERMINATE##", "").strip() + if last_agent_response: + logger.debug("*****Final Reply*****") + logger.debug(f"Final Response: {last_agent_response}") + logger.debug("*********************") + return True, None + + return False, None + +def final_reply_callback_planner_agent(message:str, message_type:MessageType = MessageType.STEP): # type: ignore + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + loop = asyncio.get_event_loop() + loop.run_until_complete(browser_manager.notify_user(message, message_type=message_type)) + return False, None # required to ensure the agent communication flow continues diff --git a/Agent_E/ae/core/prompts.py b/Agent_E/ae/core/prompts.py new file mode 100644 index 0000000..3048739 --- /dev/null +++ b/Agent_E/ae/core/prompts.py @@ -0,0 +1,185 @@ +LLM_PROMPTS = { + "USER_AGENT_PROMPT": """A proxy for the user for executing the user commands.""", + "BROWSER_NAV_EXECUTOR_PROMPT": """A proxy for the user for executing the user commands.""", + + "PLANNER_AGENT_PROMPT": """You are a web automation task planner. You will receive tasks from the user and will work with a naive helper to accomplish it. +You will think step by step and break down the tasks into sequence of simple subtasks. Subtasks will be delegated to the helper to execute. + +Return Format: +Your reply will strictly be a well-fromatted JSON with four attributes. +"plan": This is a string that contains the high-level plan. This is optional and needs to be present only when a task starts and when the plan needs to be revised. +"next_step": This is a string that contains a detailed next step that is consistent with the plan. The next step will be delegated to the helper to execute. This needs to be present for every response except when terminating +"terminate": yes/no. Return yes when the exact task is complete without any compromises or you are absolutely convinced that the task cannot be completed, no otherwise. This is mandatory for every response. +"final_response": This is the final answer string that will be returned to the user. In search tasks, unless explicitly stated, you will provide the single best suited result in the response instead of listing multiple options. This attribute only needs to be present when terminate is true. + +Capabilities and limitation of the helper: +1. Helper can navigate to urls, perform simple interactions on a page or answer any question you may have about the current page. +2. Helper cannot perform complex planning, reasoning or analysis. You will not delegate any such tasks to helper, instead you will perform them based on information from the helper. +3. Helper is stateless and treats each step as a new task. Helper will not remember previous pages or actions. So, you will provide all necessary information as part of each step. +4. Very Important: Helper cannot go back to previous pages. If you need the helper to return to a previous page, you must explicitly add the URL of the previous page in the step (e.g. return to the search result page by navigating to the url https://www.google.com/search?q=Finland") + +Guidelines: +1. If you know the direct URL, use it directly instead of searching for it (e.g. go to www.espn.com). Optimise the plan to avoid unnecessary steps. +2. Do not assume any capability exists on the webpage. Ask questions to the helper to confirm the presence of features (e.g. is there a sort by price feature available on the page?). This will help you revise the plan as needed and also establish common ground with the helper. +3. Do not combine multiple steps into one. A step should be strictly as simple as interacting with a single element or navigating to a page. If you need to interact with multiple elements or perform multiple actions, you will break it down into multiple steps. +4. Important: You will NOT ask for any URLs of hyperlinks in the page from the helper, instead you will simply ask the helper to click on specific result. URL of the current page will be automatically provided to you with each helper response. +5. Very Important: Add verification as part of the plan, after each step and specifically before terminating to ensure that the task is completed successfully. Ask simple questions to verify the step completion (e.g. Can you confirm that White Nothing Phone 2 with 16GB RAM is present in the cart?). Do not assume the helper has performed the task correctly. +6. If the task requires multiple informations, all of them are equally important and should be gathered before terminating the task. You will strive to meet all the requirements of the task. +7. If one plan fails, you MUST revise the plan and try a different approach. You will NOT terminate a task untill you are absolutely convinced that the task is impossible to accomplish. + +Complexities of web navigation: +1. Many forms have mandatory fields that need to be filled up before they can be submitted. Ask the helper for what fields look mandatory. +2. In many websites, there are multiple options to filter or sort results. Ask the helper to list any elements on the page which will help the task (e.g. are there any links or interactive elements that may lead me to the support page?). +3. Always keep in mind complexities such as filtering, advanced search, sorting, and other features that may be present on the website. Ask the helper whether these features are available on the page when relevant and use them when the task requires it. +4. Very often list of items such as, search results, list of products, list of reviews, list of people etc. may be divided into multiple pages. If you need complete information, it is critical to explicitly ask the helper to go through all the pages. +5. Sometimes search capabilities available on the page will not yield the optimal results. Revise the search query to either more specific or more generic. +6. When a page refreshes or navigates to a new page, information entered in the previous page may be lost. Check that the information needs to be re-entered (e.g. what are the values in source and destination on the page?). +7. Sometimes some elements may not be visible or be disabled until some other action is performed. Ask the helper to confirm if there are any other fields that may need to be interacted for elements to appear or be enabled. + +Example 1: +Task: Find the cheapest premium economy flights from Helsinki to Stockholm on 15 March on Skyscanner. Current page: www.google.com +{"plan":"1. Go to www.skyscanner.com. +2. List the interaction options available on skyscanner page relevant for flight reservation along with their default values. +3. Select the journey option to one-way (if not default). +4. Set number of passengers to 1 (if not default). +5. Set the departure date to 15 March 2025 (since 15 March 2024 is already past). +6. Set ticket type to Economy Premium. +7. Set from airport to ""Helsinki". +8. Set destination airport to Stockhokm +9. Confirm that current values in the source airport, destination airport and departure date fields are Helsinki, Stockholm and 15 August 2024 respectively. +10. Click on the search button to get the search results. +11. Confirm that you are on the search results page. +12. Extract the price of the cheapest flight from Helsinki to Stokchol from the search results.", +"next_step": "Go to https://www.skyscanner.com", +"terminate":"no"}, +After the task is completed and when terminating: +Your reply: {"terminate":"yes", "final_response": "The cheapest premium economy flight from Helsinki to Stockholm on 15 March 2025 is ."} + +Notice above how there is confirmation after each step and how interaction (e.g. setting source and destination) with each element is a seperate step. Follow same pattern. +Remember: you are a very very persistent planner who will try every possible strategy to accomplish the task perfectly. +Revise search query if needed, ask for more information if needed, and always verify the results before terminating the task. +Some basic information about the user: $basic_user_information""", + + "BROWSER_AGENT_PROMPT": """You will perform web navigation tasks, which may include logging into websites and interacting with any web content using the functions made available to you. + Use the provided DOM representation for element location or text summarization. + Interact with pages using only the "mmid" attribute in DOM elements. + You must extract mmid value from the fetched DOM, do not conjure it up. + Execute function sequentially to avoid navigation timing issues. Once a task is completed, confirm completion with ##TERMINATE TASK##. + The given actions are NOT parallelizable. They are intended for sequential execution. + If you need to call multiple functions in a task step, call one function at a time. Wait for the function's response before invoking the next function. This is important to avoid collision. + Strictly for search fields, submit the field by pressing Enter key. For other forms, click on the submit button. + Unless otherwise specified, the task must be performed on the current page. Use openurl only when explicitly instructed to navigate to a new page with a url specified. If you do not know the URL ask for it. + You will NOT provide any URLs of links on webpage. If user asks for URLs, you will instead provide the text of the hyperlink on the page and offer to click on it. This is very very important. + When inputing information, remember to follow the format of the input field. For example, if the input field is a date field, you will enter the date in the correct format (e.g. YYYY-MM-DD), you may get clues from the placeholder text in the input field. + if the task is ambigous or there are multiple options to choose from, you will ask the user for clarification. You will not make any assumptions. + Individual function will reply with action success and if any changes were observed as a consequence. Adjust your approach based on this feedback. + Once the task is completed or cannot be completed, return a short summary of the actions you performed to accomplish the task, and what worked and what did not. This should be followed by ##TERMINATE TASK##. Your reply will not contain any other information. + Additionally, If task requires an answer, you will also provide a short and precise answer followed by ##TERMINATE TASK##. + Ensure that user questions are answered from the DOM and not from memory or assumptions. To answer a question about textual information on the page, prefer to use text_only DOM type. To answer a question about interactive elements, use all_fields DOM type. + Do not provide any mmid values in your response. + Important: If you encounter an issues or is unsure how to proceed, simply ##TERMINATE TASK## and provide a detailed summary of the exact issue encountered. + Do not repeat the same action multiple times if it fails. Instead, if something did not work after a few attempts, terminate the task.""", + + + "VERFICATION_AGENT": """Given a conversation and a task, your task is to analyse the conversation and tell if the task is completed. If not, you need to tell what is not completed and suggest next steps to complete the task.""", + "ENTER_TEXT_AND_CLICK_PROMPT": """This skill enters text into a specified element and clicks another element, both identified by their DOM selector queries. + Ideal for seamless actions like submitting search queries, this integrated approach ensures superior performance over separate text entry and click commands. + Successfully completes when both actions are executed without errors, returning True; otherwise, it provides False or an explanatory message of any failure encountered. + Always prefer this dual-action skill for tasks that combine text input and element clicking to leverage its streamlined operation.""", + + + "OPEN_URL_PROMPT": """Opens a specified URL in the web browser instance. Returns url of the new page if successful or appropriate error message if the page could not be opened.""", + + + "GO_BACK_PROMPT": """Goes back to previous page in the browser history. Useful when correcting an incorrect action that led to a new page or when needing to revisit a previous page for information. Returns the full URL of the page after the back action is performed.""", + + + "COMMAND_EXECUTION_PROMPT": """Execute the user task "$command" $current_url_prompt_segment""", + + + "GET_USER_INPUT_PROMPT": """Get clarification by asking the user or wait for user to perform an action on webpage. This is useful e.g. when you encounter a login or captcha and requires the user to intervene. This skill will also be useful when task is ambigious and you need more clarification from the user (e.g. ["which source website to use to accomplish a task"], ["Enter your credentials on your webpage and type done to continue"]). Use this skill very sparingly and only when absolutely needed.""", + + + "GET_DOM_WITHOUT_CONTENT_TYPE_PROMPT": """Retrieves the DOM of the current web browser page. + Each DOM element will have an \"mmid\" attribute injected for ease of DOM interaction. + Returns a minified representation of the HTML DOM where each HTML DOM Element has an attribute called \"mmid\" for ease of DOM query selection. When \"mmid\" attribute is available, use it for DOM query selectors.""", + + + # This one below had all three content types including input_fields + "GET_DOM_WITH_CONTENT_TYPE_PROMPT": """Retrieves the DOM of the current web site based on the given content type. + The DOM representation returned contains items ordered in the same way they appear on the page. Keep this in mind when executing user requests that contain ordinals or numbered items. + text_only - returns plain text representing all the text in the web site. Use this for any information retrieval task. This will contain the most complete textual information. + input_fields - returns a JSON string containing a list of objects representing text input html elements with mmid attribute. Use this strictly for interaction purposes with text input fields. + all_fields - returns a JSON string containing a list of objects representing all interactive elements and their attributes with mmid attribute. Use this strictly to identify and interact with any type of elements on page. + If information is not available in one content type, you must try another content_type.""", + + + "GET_ACCESSIBILITY_TREE": """Retrieves the accessibility tree of the current web site. + The DOM representation returned contains items ordered in the same way they appear on the page. Keep this in mind when executing user requests that contain ordinals or numbered items.""", + + + "CLICK_PROMPT": """Executes a click action on the element matching the given mmid attribute value. It is best to use mmid attribute as the selector. + Returns Success if click was successful or appropriate error message if the element could not be clicked.""", + + + "CLICK_PROMPT_ACCESSIBILITY": """Executes a click action on the element a name and role. + Returns Success if click was successful or appropriate error message if the element could not be clicked.""", + + + "GET_URL_PROMPT": """Get the full URL of the current web page/site. If the user command seems to imply an action that would be suitable for an already open website in their browser, use this to fetch current website URL.""", + + + "ENTER_TEXT_PROMPT": """Single enter given text in the DOM element matching the given mmid attribute value. This will only enter the text and not press enter or anything else. + Returns Success if text entry was successful or appropriate error message if text could not be entered.""", + + + "CLICK_BY_TEXT_PROMPT": """Executes a click action on the element matching the text. If multiple text matches are found, it will click on all of them. Use this as last resort when all else fails.""", + + "BULK_ENTER_TEXT_PROMPT": """Bulk enter text in multiple DOM fields. To be used when there are multiple fields to be filled on the same page. + Enters text in the DOM elements matching the given mmid attribute value. + The input will receive a list of objects containing the DOM query selector and the text to enter. + This will only enter the text and not press enter or anything else. + Returns each selector and the result for attempting to enter text.""", + + + "PRESS_KEY_COMBINATION_PROMPT": """Presses the given key on the current web page. + This is useful for pressing the enter button to submit a search query, PageDown to scroll, ArrowDown to change selection in a focussed list etc.""", + + + "ADD_TO_MEMORY_PROMPT": """"Save any information that you may need later in this term memory. This could be useful for saving things to do, saving information for personalisation, or even saving information you may need in future for efficiency purposes E.g. Remember to call John at 5pm, This user likes Tesla company and considered buying shares, The user enrollment form is available in etc.""", + + "HOVER_PROMPT": """Hover on a element with the given mmid attribute value. Hovering on an element can reveal additional information such as a tooltip or trigger a dropdown menu with different navigation options.""", + "GET_MEMORY_PROMPT": """Retrieve all the information previously stored in the memory""", + + + "PRESS_ENTER_KEY_PROMPT": """Presses the enter key in the given html field. This is most useful on text input fields.""", + + + "EXTRACT_TEXT_FROM_PDF_PROMPT": """Extracts text from a PDF file hosted at the given URL.""", + + + "BROWSER_AGENT_NO_SKILLS_PROMPT": """You are an autonomous agent tasked with performing web navigation on a Playwright instance, including logging into websites and executing other web-based actions. + You will receive user commands, formulate a plan and then write the PYTHON code that is needed for the task to be completed. + It is possible that the code you are writing is for one step at a time in the plan. This will ensure proper execution of the task. + Your operations must be precise and efficient, adhering to the guidelines provided below: + 1. **Asynchronous Code Execution**: Your tasks will often be asynchronous in nature, requiring careful handling. Wrap asynchronous operations within an appropriate async structure to ensure smooth execution. + 2. **Sequential Task Execution**: To avoid issues related to navigation timing, execute your actions in a sequential order. This method ensures that each step is completed before the next one begins, maintaining the integrity of your workflow. Some steps like navigating to a site will require a small amount of wait time after them to ensure they load correctly. + 3. **Error Handling and Debugging**: Implement error handling to manage exceptions gracefully. Should an error occur or if the task doesn't complete as expected, review your code, adjust as necessary, and retry. Use the console or logging for debugging purposes to track the progress and issues. + 4. **Using HTML DOM**: Do not assume what a DOM selector (web elements) might be. Rather, fetch the DOM to look for the selectors or fetch DOM inner text to answer a questions. This is crucial for accurate task execution. When you fetch the DOM, reason about its content to determine appropriate selectors or text that should be extracted. To fetch the DOM using playwright you can: + - Fetch entire DOM using page.content() method. In the fetched DOM, consider if appropriate to remove entire sections of the DOM like `script`, `link` elements + - Fetch DOM inner text only text_content = await page.evaluate("() => document.body.innerText || document.documentElement.innerText"). This is useful for information retrieval. + 5. **DOM Handling**: Never ever substring the extracted HTML DOM. You can remove entire sections/elements of the DOM like `script`, `link` elements if they are not needed for the task. This is crucial for accurate task execution. + 6. **Execution Verification**: After executing the user the given code, ensure that you verify the completion of the task. If the task is not completed, revise your plan then rewrite the code for that step. + 7. **Termination Protocol**: Once a task is verified as complete or if it's determined that further attempts are unlikely to succeed, conclude the operation and respond with `##TERMINATE##`, to indicate the end of the session. This signal should only be used when the task is fully completed or if there's a consensus that continuation is futile. + 8. **Code Modification and Retry Strategy**: If your initial code doesn't achieve the desired outcome, revise your approach based on the insights gained during the process. When DOM selectors you are using fail, fetch the DOM and reason about it to discover the right selectors.If there are timeouts, adjust increase times. Add other error handling mechanisms before retrying as needed. + 9. **Code Generation**: Generated code does not need documentation or usage examples. Assume that it is being executed by an autonomous agent acting on behalf of the user. Do not add placeholders in the code. + 10. **Browser Handling**: Do not user headless mode with playwright. Do not close the browser after every step or even after task completion. Leave it open. + 11. **Reponse**: Remember that you are communicating with an autonomous agent that does not reason. All it does is execute code. Only respond with code that it can execute unless you are terminating. + 12. **Playwrite Oddities**: There are certain things that Playwright does not do well: + - page.wait_for_selector: When providing a timeout value, it will almost always timeout. Put that call in a try/except block and catch the timeout. If timeout occurs just move to the next statement in the code and most likely it will work. For example, if next statement is page.fill, just execute it. + + + By following these guidelines, you will enhance the efficiency, reliability, and user interaction of your web navigation tasks. + Always aim for clear, concise, and well-structured code that aligns with best practices in asynchronous programming and web automation. + """, +} diff --git a/Agent_E/ae/core/skills/__init__.py b/Agent_E/ae/core/skills/__init__.py new file mode 100644 index 0000000..393fac4 --- /dev/null +++ b/Agent_E/ae/core/skills/__init__.py @@ -0,0 +1,18 @@ +from Agent_E.ae.core.skills.click_using_selector import click +from Agent_E.ae.core.skills.click_using_selector import do_click +from Agent_E.ae.core.skills.click_using_selector import is_element_present +from Agent_E.ae.core.skills.click_using_selector import perform_javascript_click +from Agent_E.ae.core.skills.click_using_selector import perform_playwright_click + +from Agent_E.ae.core.skills.enter_text_and_click import enter_text_and_click + +from Agent_E.ae.core.skills.enter_text_using_selector import bulk_enter_text +from Agent_E.ae.core.skills.enter_text_using_selector import custom_fill_element +from Agent_E.ae.core.skills.enter_text_using_selector import do_entertext + +from Agent_E.ae.core.skills.get_dom_with_content_type import get_dom_with_content_type +from Agent_E.ae.core.skills.get_url import geturl +from Agent_E.ae.core.skills.get_user_input import get_user_input +from Agent_E.ae.core.skills.open_url import openurl + +from Agent_E.ae.core.skills.press_key_combination import press_key_combination \ No newline at end of file diff --git a/Agent_E/ae/core/skills/click_using_selector.py b/Agent_E/ae/core/skills/click_using_selector.py new file mode 100644 index 0000000..1b1fd42 --- /dev/null +++ b/Agent_E/ae/core/skills/click_using_selector.py @@ -0,0 +1,217 @@ +import asyncio +import inspect +import traceback +from typing import Annotated + +from playwright.async_api import ElementHandle +from playwright.async_api import Page + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.dom_helper import get_element_outer_html +from Agent_E.ae.utils.dom_mutation_observer import subscribe # type: ignore +from Agent_E.ae.utils.dom_mutation_observer import unsubscribe # type: ignore +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +async def click(selector: Annotated[str, "The properly formed query selector string to identify the element for the click action (e.g. [mmid='114']). When \"mmid\" attribute is present, use it for the query selector."], + wait_before_execution: Annotated[float, "Optional wait time in seconds before executing the click event logic.", float] = 0.0) -> Annotated[str, "A message indicating success or failure of the click."]: + """ + Executes a click action on the element matching the given query selector string within the currently open web page. + If there is no page open, it will raise a ValueError. An optional wait time can be specified before executing the click logic. Use this to wait for the page to load especially when the last action caused the DOM/Page to load. + + Parameters: + - selector: The query selector string to identify the element for the click action. + - wait_before_execution: Optional wait time in seconds before executing the click event logic. Defaults to 0.0 seconds. + + Returns: + - Success if the click was successful, Appropropriate error message otherwise. + """ + logger.info(f"Executing ClickElement with \"{selector}\" as the selector") + + # Initialize PlaywrightManager and get the active browser page + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + page = await browser_manager.get_current_page() + + if page is None: # type: ignore + raise ValueError('No active page found. OpenURL command opens a new page.') + + function_name = inspect.currentframe().f_code.co_name # type: ignore + + await browser_manager.take_screenshots(f"{function_name}_start", page) + + await browser_manager.highlight_element(selector, True) + + dom_changes_detected=None + def detect_dom_changes(changes:str): # type: ignore + nonlocal dom_changes_detected + dom_changes_detected = changes # type: ignore + + subscribe(detect_dom_changes) + result = await do_click(page, selector, wait_before_execution) + await asyncio.sleep(0.1) # sleep for 100ms to allow the mutation observer to detect changes + unsubscribe(detect_dom_changes) + await browser_manager.take_screenshots(f"{function_name}_end", page) + await browser_manager.notify_user(result["summary_message"], message_type=MessageType.ACTION) + + if dom_changes_detected: + return f"Success: {result['summary_message']}.\n As a consequence of this action, new elements have appeared in view: {dom_changes_detected}. This means that the action to click {selector} is not yet executed and needs further interaction. Get all_fields DOM to complete the interaction." + return result["detailed_message"] + + +async def do_click(page: Page, selector: str, wait_before_execution: float) -> dict[str, str]: + """ + Executes the click action on the element with the given selector within the provided page. + + Parameters: + - page: The Playwright page instance. + - selector: The query selector string to identify the element for the click action. + - wait_before_execution: Optional wait time in seconds before executing the click event logic. + + Returns: + dict[str,str] - Explanation of the outcome of this operation represented as a dictionary with 'summary_message' and 'detailed_message'. + """ + logger.info(f"Executing ClickElement with \"{selector}\" as the selector. Wait time before execution: {wait_before_execution} seconds.") + + # Wait before execution if specified + if wait_before_execution > 0: + await asyncio.sleep(wait_before_execution) + + # Wait for the selector to be present and ensure it's attached and visible. If timeout, try javascript click + try: + logger.info(f"Executing ClickElement with \"{selector}\" as the selector. Waiting for the element to be attached and visible.") + + element = await asyncio.wait_for( + page.wait_for_selector(selector, state="attached", timeout=2000), + timeout=2000 + ) + if element is None: + raise ValueError(f"Element with selector: \"{selector}\" not found") + + logger.info(f"Element with selector: \"{selector}\" is attached. scrolling it into view if needed.") + try: + await element.scroll_into_view_if_needed(timeout=200) + logger.info(f"Element with selector: \"{selector}\" is attached and scrolled into view. Waiting for the element to be visible.") + except Exception: + # If scrollIntoView fails, just move on, not a big deal + pass + + try: + await element.wait_for_element_state("visible", timeout=200) + logger.info(f"Executing ClickElement with \"{selector}\" as the selector. Element is attached and visibe. Clicking the element.") + except Exception: + # If the element is not visible, try to click it anyway + pass + + element_tag_name = await element.evaluate("element => element.tagName.toLowerCase()") + element_outer_html = await get_element_outer_html(element, page, element_tag_name) + + + if element_tag_name == "option": + element_value = await element.get_attribute("value") # get the text that is in the value of the option + parent_element = await element.evaluate_handle("element => element.parentNode") + # await parent_element.evaluate(f"element => element.select_option(value=\"{element_value}\")") + await parent_element.select_option(value=element_value) # type: ignore + + logger.info(f'Select menu option "{element_value}" selected') + + return {"summary_message": f'Select menu option "{element_value}" selected', + "detailed_message": f'Select menu option "{element_value}" selected. The select element\'s outer HTML is: {element_outer_html}.'} + + + #Playwright click seems to fail more often than not, disabling it for now and just going with JS click + #await perform_playwright_click(element, selector) + msg = await perform_javascript_click(page, selector) + return {"summary_message": msg, "detailed_message": f"{msg} The clicked element's outer HTML is: {element_outer_html}."} # type: ignore + except Exception as e: + logger.error(f"Unable to click element with selector: \"{selector}\". Error: {e}") + traceback.print_exc() + msg = f"Unable to click element with selector: \"{selector}\" since the selector is invalid. Proceed by retrieving DOM again." + return {"summary_message": msg, "detailed_message": f"{msg}. Error: {e}"} + + +async def is_element_present(page: Page, selector: str) -> bool: + """ + Checks if an element is present on the page. + + Parameters: + - page: The Playwright page instance. + - selector: The query selector string to identify the element. + + Returns: + - True if the element is present, False otherwise. + """ + element = await page.query_selector(selector) + return element is not None + + +async def perform_playwright_click(element: ElementHandle, selector: str): + """ + Performs a click action on the element using Playwright's click method. + + Parameters: + - element: The Playwright ElementHandle instance representing the element to be clicked. + - selector: The query selector string of the element. + + Returns: + - None + """ + logger.info(f"Performing first Step: Playwright Click on element with selector: {selector}") + await element.click(force=False, timeout=200) + + +async def perform_javascript_click(page: Page, selector: str): + """ + Performs a click action on the element using JavaScript. + + Parameters: + - page: The Playwright page instance. + - selector: The query selector string of the element. + + Returns: + - None + """ + js_code = """(selector) => { + let element = document.querySelector(selector); + + if (!element) { + console.log(`perform_javascript_click: Element with selector ${selector} not found`); + return `perform_javascript_click: Element with selector ${selector} not found`; + } + + if (element.tagName.toLowerCase() === "option") { + let value = element.text; + let parent = element.parentElement; + + parent.value = element.value; // Directly set the value if possible + // Trigger change event if necessary + let event = new Event('change', { bubbles: true }); + parent.dispatchEvent(event); + + console.log("Select menu option", value, "selected"); + return "Select menu option: "+ value+ " selected"; + } + else { + console.log("About to click selector", selector); + // If the element is a link, make it open in the same tab + if (element.tagName.toLowerCase() === "a") { + element.target = "_self"; + } + let ariaExpandedBeforeClick = element.getAttribute('aria-expanded'); + element.click(); + let ariaExpandedAfterClick = element.getAttribute('aria-expanded'); + if (ariaExpandedBeforeClick === 'false' && ariaExpandedAfterClick === 'true') { + return "Executed JavaScript Click on element with selector: "+selector +". Very important: As a consequence a menu has appeared where you may need to make further selction. Very important: Get all_fields DOM to complete the action."; + } + return "Executed JavaScript Click on element with selector: "+selector; + } + }""" + try: + logger.info(f"Executing JavaScript click on element with selector: {selector}") + result:str = await page.evaluate(js_code, selector) + logger.debug(f"Executed JavaScript Click on element with selector: {selector}") + return result + except Exception as e: + logger.error(f"Error executing JavaScript click on element with selector: {selector}. Error: {e}") + traceback.print_exc() + diff --git a/Agent_E/ae/core/skills/enter_text_and_click.py b/Agent_E/ae/core/skills/enter_text_and_click.py new file mode 100644 index 0000000..6ebd09c --- /dev/null +++ b/Agent_E/ae/core/skills/enter_text_and_click.py @@ -0,0 +1,82 @@ +import asyncio +import inspect +from typing import Annotated + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.core.skills.click_using_selector import do_click +from Agent_E.ae.core.skills.enter_text_using_selector import do_entertext +from Agent_E.ae.core.skills.press_key_combination import do_press_key_combination +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +async def enter_text_and_click( + text_selector: Annotated[str, "The properly formatted DOM selector query, for example [mmid='1234'], where the text will be entered. Use mmid attribute."], + text_to_enter: Annotated[str, "The text that will be entered into the element specified by text_selector."], + click_selector: Annotated[str, "The properly formatted DOM selector query, for example [mmid='1234'], for the element that will be clicked after text entry."], + wait_before_click_execution: Annotated[float, "Optional wait time in seconds before executing the click.", float] = 0.0 +) -> Annotated[str, "A message indicating success or failure of the text entry and click."]: + """ + Enters text into an element and then clicks on another element. + + Parameters: + - text_selector: The selector for the element to enter text into. It should be a properly formatted DOM selector query, for example [mmid='1234'], where the text will be entered. Use the mmid attribute. + - text_to_enter: The text to enter into the element specified by text_selector. + - click_selector: The selector for the element to click. It should be a properly formatted DOM selector query, for example [mmid='1234']. + - wait_before_click_execution: Optional wait time in seconds before executing the click action. Default is 0.0. + + Returns: + - A message indicating the success or failure of the text entry and click. + + Raises: + - ValueError: If no active page is found. The OpenURL command opens a new page. + + Example usage: + ``` + await enter_text_and_click("[mmid='1234']", "Hello, World!", "[mmid='5678']", wait_before_click_execution=1.5) + ``` + """ + logger.info(f"Entering text '{text_to_enter}' into element with selector '{text_selector}' and then clicking element with selector '{click_selector}'.") + + # Initialize PlaywrightManager and get the active browser page + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + page = await browser_manager.get_current_page() + if page is None: # type: ignore + logger.error("No active page found") + raise ValueError('No active page found. OpenURL command opens a new page.') + + await browser_manager.highlight_element(text_selector, True) + + function_name = inspect.currentframe().f_code.co_name # type: ignore + await browser_manager.take_screenshots(f"{function_name}_start", page) + + text_entry_result = await do_entertext(page, text_selector, text_to_enter, use_keyboard_fill=True) + + #await browser_manager.notify_user(text_entry_result["summary_message"]) + if not text_entry_result["summary_message"].startswith("Success"): + await browser_manager.take_screenshots(f"{function_name}_end", page) + return(f"Failed to enter text '{text_to_enter}' into element with selector '{text_selector}'. Check that the selctor is valid.") + + result = text_entry_result + + #if the text_selector is the same as the click_selector, press the Enter key instead of clicking + if text_selector == click_selector: + do_press_key_combination_result = await do_press_key_combination(browser_manager, page, "Enter") + if do_press_key_combination_result: + result["detailed_message"] += f" Instead of click, pressed the Enter key successfully on element: \"{click_selector}\"." + await browser_manager.notify_user(f"Pressed the Enter key successfully on element: \"{click_selector}\".", message_type=MessageType.ACTION) + else: + result["detailed_message"] += f" Clicking the same element after entering text in it, is of no value. Tried pressing the Enter key on element \"{click_selector}\" instead of click and failed." + await browser_manager.notify_user("Failed to press the Enter key on element \"{click_selector}\".", message_type=MessageType.ACTION) + else: + await browser_manager.highlight_element(click_selector, True) + + do_click_result = await do_click(page, click_selector, wait_before_click_execution) + result["detailed_message"] += f' {do_click_result["detailed_message"]}' + #await browser_manager.notify_user(do_click_result["summary_message"]) + + await asyncio.sleep(0.1) # sleep for 100ms to allow the mutation observer to detect changes + + await browser_manager.take_screenshots(f"{function_name}_end", page) + + return result["detailed_message"] diff --git a/Agent_E/ae/core/skills/enter_text_using_selector.py b/Agent_E/ae/core/skills/enter_text_using_selector.py new file mode 100644 index 0000000..078ceda --- /dev/null +++ b/Agent_E/ae/core/skills/enter_text_using_selector.py @@ -0,0 +1,263 @@ +import asyncio +import inspect +import traceback +from dataclasses import dataclass +from typing import Annotated +from typing import List # noqa: UP035 + +from playwright.async_api import Page + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.core.skills.press_key_combination import press_key_combination +from Agent_E.ae.utils.dom_helper import get_element_outer_html +from Agent_E.ae.utils.dom_mutation_observer import subscribe +from Agent_E.ae.utils.dom_mutation_observer import unsubscribe +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +@dataclass +class EnterTextEntry: + """ + Represents an entry for text input. + + Attributes: + query_selector (str): A valid DOM selector query. Use the mmid attribute. + text (str): The text to enter in the element identified by the query_selector. + """ + + query_selector: str + text: str + + def __getitem__(self, key: str) -> str: + if key == "query_selector": + return self.query_selector + elif key == "text": + return self.text + else: + raise KeyError(f"{key} is not a valid key") + + +async def custom_fill_element(page: Page, selector: str, text_to_enter: str): + """ + Sets the value of a DOM element to a specified text without triggering keyboard input events. + + This function directly sets the 'value' property of a DOM element identified by the given CSS selector, + effectively changing its current value to the specified text. This approach bypasses the need for + simulating keyboard typing, providing a more efficient and reliable way to fill in text fields, + especially in automated testing scenarios where speed and accuracy are paramount. + + Args: + page (Page): The Playwright Page object representing the browser tab in which the operation will be performed. + selector (str): The CSS selector string used to locate the target DOM element. The function will apply the + text change to the first element that matches this selector. + text_to_enter (str): The text value to be set in the target element. Existing content will be overwritten. + + Example: + await custom_fill_element(page, '#username', 'test_user') + + Note: + This function does not trigger input-related events (like 'input' or 'change'). If application logic + relies on these events being fired, additional steps may be needed to simulate them. + """ + selector = f"{selector}" # Ensures the selector is treated as a string + try: + result = await page.evaluate( + """(inputParams) => { + const selector = inputParams.selector; + let text_to_enter = inputParams.text_to_enter; + text_to_enter = text_to_enter.trim(); + const element = document.querySelector(selector); + if (!element) { + throw new Error(`Element not found: ${selector}`); + } + element.value = text_to_enter; + return `Value set for ${selector}`; + }""", + {"selector": selector, "text_to_enter": text_to_enter}, + ) + logger.debug(f"custom_fill_element result: {result}") + except Exception as e: + logger.error(f"Error in custom_fill_element, Selector: {selector}, Text: {text_to_enter}. Error: {str(e)}") + raise + +async def entertext(entry: Annotated[EnterTextEntry, "An object containing 'query_selector' (DOM selector query using mmid attribute e.g. [mmid='114']) and 'text' (text to enter on the element)."]) -> Annotated[str, "Explanation of the outcome of this operation."]: + """ + Enters text into a DOM element identified by a CSS selector. + + This function enters the specified text into a DOM element identified by the given CSS selector. + It uses the Playwright library to interact with the browser and perform the text entry operation. + The function supports both direct setting of the 'value' property and simulating keyboard typing. + + Args: + entry (EnterTextEntry): An object containing 'query_selector' (DOM selector query using mmid attribute) + and 'text' (text to enter on the element). + + Returns: + str: Explanation of the outcome of this operation. + + Example: + entry = EnterTextEntry(query_selector='#username', text='test_user') + result = await entertext(entry) + + Note: + - The 'query_selector' should be a valid CSS selector that uniquely identifies the target element. + - The 'text' parameter specifies the text to be entered into the element. + - The function uses the PlaywrightManager to manage the browser instance. + - If no active page is found, an error message is returned. + - The function internally calls the 'do_entertext' function to perform the text entry operation. + - The 'do_entertext' function applies a pulsating border effect to the target element during the operation. + - The 'use_keyboard_fill' parameter in 'do_entertext' determines whether to simulate keyboard typing or not. + - If 'use_keyboard_fill' is set to True, the function uses the 'page.keyboard.type' method to enter the text. + - If 'use_keyboard_fill' is set to False, the function uses the 'custom_fill_element' method to enter the text. + """ + logger.info(f"Entering text: {entry}") + query_selector: str = entry['query_selector'] + text_to_enter: str = entry['text'] + + # Create and use the PlaywrightManager + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + page = await browser_manager.get_current_page() + if page is None: # type: ignore + return "Error: No active page found. OpenURL command opens a new page." + + function_name = inspect.currentframe().f_code.co_name # type: ignore + + await browser_manager.take_screenshots(f"{function_name}_start", page) + + await browser_manager.highlight_element(query_selector, True) + + dom_changes_detected=None + def detect_dom_changes(changes:str): # type: ignore + nonlocal dom_changes_detected + dom_changes_detected = changes # type: ignore + + subscribe(detect_dom_changes) + + await page.evaluate( + """ + (selector) => { + const element = document.querySelector(selector); + if (element) { + element.value = ''; + } else { + console.error('Element not found:', selector); + } + } + """, + query_selector, + ) + + result = await do_entertext(page, query_selector, text_to_enter) + await asyncio.sleep(0.1) # sleep for 100ms to allow the mutation observer to detect changes + unsubscribe(detect_dom_changes) + + await browser_manager.take_screenshots(f"{function_name}_end", page) + + await browser_manager.notify_user(result["summary_message"], message_type=MessageType.ACTION) + if dom_changes_detected: + return f"{result['detailed_message']}.\n As a consequence of this action, new elements have appeared in view: {dom_changes_detected}. This means that the action of entering text {text_to_enter} is not yet executed and needs further interaction. Get all_fields DOM to complete the interaction." + return result["detailed_message"] + + +async def do_entertext(page: Page, selector: str, text_to_enter: str, use_keyboard_fill: bool=True): + """ + Performs the text entry operation on a DOM element. + + This function performs the text entry operation on a DOM element identified by the given CSS selector. + It applies a pulsating border effect to the element during the operation for visual feedback. + The function supports both direct setting of the 'value' property and simulating keyboard typing. + + Args: + page (Page): The Playwright Page object representing the browser tab in which the operation will be performed. + selector (str): The CSS selector string used to locate the target DOM element. + text_to_enter (str): The text value to be set in the target element. Existing content will be overwritten. + use_keyboard_fill (bool, optional): Determines whether to simulate keyboard typing or not. + Defaults to False. + + Returns: + dict[str, str]: Explanation of the outcome of this operation represented as a dictionary with 'summary_message' and 'detailed_message'. + + Example: + result = await do_entertext(page, '#username', 'test_user') + + Note: + - The 'use_keyboard_fill' parameter determines whether to simulate keyboard typing or not. + - If 'use_keyboard_fill' is set to True, the function uses the 'page.keyboard.type' method to enter the text. + - If 'use_keyboard_fill' is set to False, the function uses the 'custom_fill_element' method to enter the text. + """ + try: + + logger.debug(f"Looking for selector {selector} to enter text: {text_to_enter}") + + elem = await page.query_selector(selector) + + if elem is None: + error = f"Error: Selector {selector} not found. Unable to continue." + return {"summary_message": error, "detailed_message": error} + + logger.info(f"Found selector {selector} to enter text") + element_outer_html = await get_element_outer_html(elem, page) + + if use_keyboard_fill: + await elem.focus() + await asyncio.sleep(0.1) + await press_key_combination("Control+A") + await asyncio.sleep(0.1) + await press_key_combination("Backspace") + await asyncio.sleep(0.1) + logger.debug(f"Focused element with selector {selector} to enter text") + #add a 100ms delay + await page.keyboard.type(text_to_enter, delay=1) + else: + await custom_fill_element(page, selector, text_to_enter) + await elem.focus() + logger.info(f"Success. Text \"{text_to_enter}\" set successfully in the element with selector {selector}") + success_msg = f"Success. Text \"{text_to_enter}\" set successfully in the element with selector {selector}" + return {"summary_message": success_msg, "detailed_message": f"{success_msg} and outer HTML: {element_outer_html}."} + + except Exception as e: + traceback.print_exc() + error = f"Error entering text in selector {selector}." + return {"summary_message": error, "detailed_message": f"{error} Error: {e}"} + + +async def bulk_enter_text( + entries: Annotated[List[dict[str, str]], "List of objects, each containing 'query_selector' and 'text'."] # noqa: UP006 +) -> Annotated[List[dict[str, str]], "List of dictionaries, each containing 'query_selector' and the result of the operation."]: # noqa: UP006 + """ + Enters text into multiple DOM elements using a bulk operation. + + This function enters text into multiple DOM elements using a bulk operation. + It takes a list of dictionaries, where each dictionary contains a 'query_selector' and 'text' pair. + The function internally calls the 'entertext' function to perform the text entry operation for each entry. + + Args: + entries: List of objects, each containing 'query_selector' and 'text'. + + Returns: + List of dictionaries, each containing 'query_selector' and the result of the operation. + + Example: + entries = [ + {"query_selector": "#username", "text": "test_user"}, + {"query_selector": "#password", "text": "test_password"} + ] + results = await bulk_enter_text(entries) + + Note: + - Each entry in the 'entries' list should be a dictionary with 'query_selector' and 'text' keys. + - The result is a list of dictionaries, where each dictionary contains the 'query_selector' and the result of the operation. + """ + + results: List[dict[str, str]] = [] # noqa: UP006 + logger.info("Executing bulk Enter Text Command") + for entry in entries: + query_selector = entry['query_selector'] + text_to_enter = entry['text'] + logger.info(f"Entering text: {text_to_enter} in element with selector: {query_selector}") + result = await entertext(EnterTextEntry(query_selector=query_selector, text=text_to_enter)) + + results.append({"query_selector": query_selector, "result": result}) + + return results diff --git a/Agent_E/ae/core/skills/get_dom_with_content_type.py b/Agent_E/ae/core/skills/get_dom_with_content_type.py new file mode 100644 index 0000000..981cbb1 --- /dev/null +++ b/Agent_E/ae/core/skills/get_dom_with_content_type.py @@ -0,0 +1,115 @@ +import os +import time +from typing import Annotated +from typing import Any + +from playwright.async_api import Page + +from Agent_E.ae.config import SOURCE_LOG_FOLDER_PATH +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.dom_helper import wait_for_non_loading_dom_state +from Agent_E.ae.utils.get_detailed_accessibility_tree import do_get_accessibility_info +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +async def get_dom_with_content_type( + content_type: Annotated[str, "The type of content to extract: 'text_only': Extracts the innerText of the highest element in the document and responds with text, or 'input_fields': Extracts the text input and button elements in the dom."] + ) -> Annotated[dict[str, Any] | str | None, "The output based on the specified content type."]: + """ + Retrieves and processes the DOM of the active page in a browser instance based on the specified content type. + + Parameters + ---------- + content_type : str + The type of content to extract. Possible values are: + - 'text_only': Extracts the innerText of the highest element in the document and responds with text. + - 'input_fields': Extracts the text input and button elements in the DOM and responds with a JSON object. + - 'all_fields': Extracts all the fields in the DOM and responds with a JSON object. + + Returns + ------- + dict[str, Any] | str | None + The processed content based on the specified content type. This could be: + - A JSON object for 'input_fields' with just inputs. + - Plain text for 'text_only'. + - A minified DOM represented as a JSON object for 'all_fields'. + + Raises + ------ + ValueError + If an unsupported content_type is provided. + """ + + logger.info(f"Executing Get DOM Command based on content_type: {content_type}") + start_time = time.time() + # Create and use the PlaywrightManager + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + page = await browser_manager.get_current_page() + if page is None: # type: ignore + raise ValueError('No active page found. OpenURL command opens a new page.') + + extracted_data = None + await wait_for_non_loading_dom_state(page, 2000) # wait for the DOM to be ready, non loading means external resources do not need to be loaded + user_success_message = "" + if content_type == 'all_fields': + user_success_message = "Fetched all the fields in the DOM" + extracted_data = await do_get_accessibility_info(page, only_input_fields=False) + elif content_type == 'input_fields': + logger.debug('Fetching DOM for input_fields') + extracted_data = await do_get_accessibility_info(page, only_input_fields=True) + if extracted_data is None: + return "Could not fetch input fields. Please consider trying with content_type all_fields." + user_success_message = "Fetched only input fields in the DOM" + elif content_type == 'text_only': + # Extract text from the body or the highest-level element + logger.debug('Fetching DOM for text_only') + text_content = await get_filtered_text_content(page) + with open(os.path.join(SOURCE_LOG_FOLDER_PATH, 'text_only_dom.txt'), 'w', encoding='utf-8') as f: + f.write(text_content) + extracted_data = text_content + user_success_message = "Fetched the text content of the DOM" + else: + raise ValueError(f"Unsupported content_type: {content_type}") + + elapsed_time = time.time() - start_time + logger.info(f"Get DOM Command executed in {elapsed_time} seconds") + await browser_manager.notify_user(user_success_message, message_type=MessageType.ACTION) + return extracted_data # type: ignore + + +async def get_filtered_text_content(page: Page) -> str: + text_content = await page.evaluate(""" + () => { + // Array of query selectors to filter out + const selectorsToFilter = ['#agente-overlay']; + + // Store the original visibility values to revert later + const originalStyles = []; + + // Hide the elements matching the query selectors + selectorsToFilter.forEach(selector => { + const elements = document.querySelectorAll(selector); + elements.forEach(element => { + originalStyles.push({ element: element, originalStyle: element.style.visibility }); + element.style.visibility = 'hidden'; + }); + }); + + // Get the text content of the page + let textContent = document?.body?.innerText || document?.documentElement?.innerText || ""; + + // Get all the alt text from images on the page + let altTexts = Array.from(document.querySelectorAll('img')).map(img => img.alt); + altTexts="Other Alt Texts in the page: " + altTexts.join(' '); + + // Revert the visibility changes + originalStyles.forEach(entry => { + entry.element.style.visibility = entry.originalStyle; + }); + textContent=textContent+" "+altTexts; + return textContent; + } + """) + return text_content + diff --git a/Agent_E/ae/core/skills/get_url.py b/Agent_E/ae/core/skills/get_url.py new file mode 100644 index 0000000..b6fff0b --- /dev/null +++ b/Agent_E/ae/core/skills/get_url.py @@ -0,0 +1,40 @@ +from typing import Annotated + +from Agent_E.ae.core.playwright_manager import PlaywrightManager + + +async def geturl() -> Annotated[str, "Returns the full URL of the current active web site/page."]: + """ + Returns the full URL of the current page + + Parameters: + + Returns: + - Full URL the browser's active page. + """ + + + try: + # Create and use the PlaywrightManager + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + page = await browser_manager.get_current_page() + + if not page: + raise ValueError('No active page found. OpenURL command opens a new page.') + + await page.wait_for_load_state("domcontentloaded") + + # Get the URL of the current page + try: + title = await page.title() + current_url = page.url + if len(current_url) >250: + current_url = current_url[:250] + "..." + return f"Current Page: {current_url}, Title: {title}" # type: ignore + except: # noqa: E722 + current_url = page.url + return f"Current Page: {current_url}" + + except Exception as e: + raise ValueError('No active page found. OpenURL command opens a new page.') from e + diff --git a/Agent_E/ae/core/skills/get_user_input.py b/Agent_E/ae/core/skills/get_user_input.py new file mode 100644 index 0000000..bf82e73 --- /dev/null +++ b/Agent_E/ae/core/skills/get_user_input.py @@ -0,0 +1,26 @@ +from typing import Annotated +from typing import List # noqa: UP035 + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.cli_helper import answer_questions_over_cli + + +async def get_user_input(questions: Annotated[List[str], "List of questions to ask the user each one represented as a string"] ) -> dict[str, str]: # noqa: UP006 + """ + Asks the user a list of questions and returns the answers in a dictionary. + + Parameters: + - questions: A list of questions to ask the user ["What is Username?", "What is your password?"]. + + Returns: + - Newline separated list of questions to ask the user + """ + + answers: dict[str, str] = {} + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + if browser_manager.ui_manager: + for question in questions: + answers[question] = await browser_manager.prompt_user(f"Question: {question}") + else: + answers = await answer_questions_over_cli(questions) + return answers diff --git a/Agent_E/ae/core/skills/open_url.py b/Agent_E/ae/core/skills/open_url.py new file mode 100644 index 0000000..967263e --- /dev/null +++ b/Agent_E/ae/core/skills/open_url.py @@ -0,0 +1,70 @@ +import inspect +from typing import Annotated + +from playwright.async_api import TimeoutError as PlaywrightTimeoutError + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +async def openurl(url: Annotated[str, "The URL to navigate to. Value must include the protocol (http:// or https://)."], + timeout: Annotated[int, "Additional wait time in seconds after initial load."] = 3) -> Annotated[str, "Returns the result of this request in text form"]: + """ + Opens a specified URL in the active browser instance. Waits for an initial load event, then waits for either + the 'domcontentloaded' event or a configurable timeout, whichever comes first. + + Parameters: + - url: The URL to navigate to. + - timeout: Additional time in seconds to wait after the initial load before considering the navigation successful. + + Returns: + - URL of the new page. + """ + logger.info(f"Opening URL: {url}") + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + await browser_manager.get_browser_context() + page = await browser_manager.get_current_page() + try: + url = ensure_protocol(url) + if page.url == url: + logger.info(f"Current page URL is the same as the new URL: {url}. No need to refresh.") + title = await page.title() + return f"Page already loaded: {url}, Title: {title}" # type: ignore + + # Navigate to the URL with a short timeout to ensure the initial load starts + function_name = inspect.currentframe().f_code.co_name # type: ignore + + await browser_manager.take_screenshots(f"{function_name}_start", page) + + await page.goto(url, timeout=timeout*1000) # type: ignore + except PlaywrightTimeoutError as pte: + logger.warn(f"Initial navigation to {url} failed: {pte}. Will try to continue anyway.") # happens more often than not, but does not seem to be a problem + except Exception as e: + logger.error(f"An error occurred while opening the URL: {url}. Error: {e}") + import traceback + traceback.print_exc() + + await browser_manager.take_screenshots(f"{function_name}_end", page) + + await browser_manager.notify_user(f"Opened URL: {url}", message_type=MessageType.ACTION) + # Get the page title + title = await page.title() + url=page.url + return f"Page loaded: {url}, Title: {title}" # type: ignore + +def ensure_protocol(url: str) -> str: + """ + Ensures that a URL has a protocol (http:// or https://). If it doesn't have one, + https:// is added by default. + + Parameters: + - url: The URL to check and modify if necessary. + + Returns: + - A URL string with a protocol. + """ + if not url.startswith(('http://', 'https://')): + url = 'https://' + url # Default to http if no protocol is specified + logger.info(f"Added 'https://' protocol to URL because it was missing. New URL is: {url}") + return url diff --git a/Agent_E/ae/core/skills/pdf_text_extractor.py b/Agent_E/ae/core/skills/pdf_text_extractor.py new file mode 100644 index 0000000..3a4995e --- /dev/null +++ b/Agent_E/ae/core/skills/pdf_text_extractor.py @@ -0,0 +1,88 @@ +import os +from typing import Annotated + +import httpx +import pdfplumber + +from Agent_E.ae.config import PROJECT_TEMP_PATH +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +async def extract_text_from_pdf(pdf_url: Annotated[str, "The URL of the PDF file to extract text from."]) -> Annotated[str, "All the text found in the PDF file."]: + """ + Extract text from a PDF file. + pdf_url: str - The URL of the PDF file to extract text from. + returns: str - All the text found in the PDF. + """ + file_path = os.path.join(PROJECT_TEMP_PATH, "downloaded_file.pdf") # fixed file path for downloading the PDF + + try: + # Create and use the PlaywrightManager + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + + # Download the PDF + download_result = await download_pdf(pdf_url, file_path) + if not os.path.exists(download_result): + return download_result # Return error message if download failed + + # Open the PDF using pdfplumber and extract text + text = "" + with pdfplumber.open(download_result) as pdf: + for page in pdf.pages: + page_text = page.extract_text() + if page_text: + text += page_text + "\n" + extracted_text = text.strip() + word_count = len(extracted_text.split()) + await browser_manager.notify_user(f"Extracted text from the PDF successfully. Found {word_count} words.", message_type=MessageType.ACTION) + return "Text found in the PDF:\n" + extracted_text + except httpx.HTTPStatusError as e: + logger.error(f"An error occurred while downloading the PDF from {pdf_url}: {str(e)}") + return f"An error occurred while downloading the PDF: {str(e)}" + except Exception as e: + logger.error(f"An error occurred while extracting text from the PDF that was downloaded from {pdf_url}: {str(e)}") + return f"An error occurred while extracting text: {str(e)}" + finally: + # Cleanup: Ensure the downloaded file is removed + cleanup_temp_files(file_path) + +def cleanup_temp_files(*file_paths: str) -> None: + """ + Remove the specified temporary files. + + *file_paths: str - One or more file paths to be removed. + """ + for file_path in file_paths: + if os.path.exists(file_path): + try: + os.remove(file_path) + logger.debug(f"Cleaned file from the filesystem: {file_path}") + except Exception as e: + logger.error(f"Failed to remove {file_path}: {str(e)}") + else: + logger.debug(f"File not found. Unable to clean it from the filesystem: {file_path}") + +async def download_pdf(pdf_url: str, file_path: str) -> str: + """ + Download the PDF file from the given URL and save it to the specified path. + + pdf_url: str - The URL of the PDF file to download. + file_path: str - The local path to save the downloaded PDF. + + returns: str - The file path of the downloaded PDF if successful, otherwise an error message. + raises: Exception - If an error occurs during the download process. + """ + try: + logger.info(f"Downloading PDF from: {pdf_url} to: {file_path}") + async with httpx.AsyncClient() as client: + response = await client.get(pdf_url) + response.raise_for_status() # Ensure the request was successful + with open(file_path, 'wb') as pdf_file: + pdf_file.write(response.content) + return file_path + # except httpx.HTTPStatusError as e: + # raise e + except Exception as e: + raise e diff --git a/Agent_E/ae/core/skills/press_key_combination.py b/Agent_E/ae/core/skills/press_key_combination.py new file mode 100644 index 0000000..5035df4 --- /dev/null +++ b/Agent_E/ae/core/skills/press_key_combination.py @@ -0,0 +1,111 @@ +import asyncio +import inspect +from typing import Annotated + +from playwright.async_api import Page # type: ignore + +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.dom_mutation_observer import subscribe # type: ignore +from Agent_E.ae.utils.dom_mutation_observer import unsubscribe # type: ignore +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +async def press_key_combination(key_combination: Annotated[str, "The key to press, e.g., Enter, PageDown etc"]) -> str: + """ + Presses a key combination on the current active page managed by PlaywrightManager. + + This function simulates the pressing of a key or a combination of keys on the current active web page. + The `key_combination` should be a string that represents the keys to be pressed, separated by '+' if it's a combination. + For example, 'Control+C' to copy or 'Alt+F4' to close a window on Windows. + + Parameters: + - key_combination (Annotated[str, "The key combination to press, e.g., 'Control+C'."]): The key combination to press, represented as a string. For combinations, use '+' as a separator. + + Raises: + - ValueError: If no active page is found. + + Returns: + str: status of the operation expressed as a string + """ + + logger.info(f"Executing press_key_combination with key combo: {key_combination}") + # Create and use the PlaywrightManager + browser_manager = PlaywrightManager() + page = await browser_manager.get_current_page() + + if page is None: # type: ignore + raise ValueError('No active page found. OpenURL command opens a new page.') + + # Split the key combination if it's a combination of keys + keys = key_combination.split('+') + + dom_changes_detected=None + def detect_dom_changes(changes:str): # type: ignore + nonlocal dom_changes_detected + dom_changes_detected = changes # type: ignore + + subscribe(detect_dom_changes) + # If it's a combination, hold down the modifier keys + for key in keys[:-1]: # All keys except the last one are considered modifier keys + await page.keyboard.down(key) + + # Press the last key in the combination + await page.keyboard.press(keys[-1]) + + # Release the modifier keys + for key in keys[:-1]: + await page.keyboard.up(key) + await asyncio.sleep(0.1) # sleep for 100ms to allow the mutation observer to detect changes + unsubscribe(detect_dom_changes) + + if dom_changes_detected: + return f"Key {key_combination} executed successfully.\n As a consequence of this action, new elements have appeared in view:{dom_changes_detected}. This means that the action is not yet executed and needs further interaction. Get all_fields DOM to complete the interaction." + + await browser_manager.notify_user(f"Key {key_combination} executed successfully", message_type=MessageType.ACTION) + return f"Key {key_combination} executed successfully" + + +async def do_press_key_combination(browser_manager: PlaywrightManager, page: Page, key_combination: str) -> bool: + """ + Presses a key combination on the provided page. + + This function simulates the pressing of a key or a combination of keys on a web page. + The `key_combination` should be a string that represents the keys to be pressed, separated by '+' if it's a combination. + For example, 'Control+C' to copy or 'Alt+F4' to close a window on Windows. + + Parameters: + - browser_manager (PlaywrightManager): The PlaywrightManager instance. + - page (Page): The Playwright page instance. + - key_combination (str): The key combination to press, represented as a string. For combinations, use '+' as a separator. + + Returns: + bool: True if success and False if failed + """ + + logger.info(f"Executing press_key_combination with key combo: {key_combination}") + try: + function_name = inspect.currentframe().f_code.co_name # type: ignore + await browser_manager.take_screenshots(f"{function_name}_start", page) + # Split the key combination if it's a combination of keys + keys = key_combination.split('+') + + # If it's a combination, hold down the modifier keys + for key in keys[:-1]: # All keys except the last one are considered modifier keys + await page.keyboard.down(key) + + # Press the last key in the combination + await page.keyboard.press(keys[-1]) + + # Release the modifier keys + for key in keys[:-1]: + await page.keyboard.up(key) + + except Exception as e: + logger.error(f"Error executing press_key_combination \"{key_combination}\": {e}") + return False + + await browser_manager.take_screenshots(f"{function_name}_end", page) + + return True + diff --git a/Agent_E/ae/core/skills/skill_registry.py b/Agent_E/ae/core/skills/skill_registry.py new file mode 100644 index 0000000..a40b872 --- /dev/null +++ b/Agent_E/ae/core/skills/skill_registry.py @@ -0,0 +1,29 @@ +# skill_registry.py +from collections.abc import Callable +from typing import Any + +# Define the type of the functions that will be registered as skills +SkillType = Callable[..., Any] + +# Global registry to store private skill functions and their metadata +skill_registry: list[dict[str, Any]] = [] + +def skill(description: str, name: str|None = None) -> Callable[[SkillType], SkillType]: + """ + Decorator for registering private skills. + + Parameters: + - description: A string describing the skill's function. + - name: Optional name to register the skill with. If not provided, the function's name will be used. + + Returns: + - A decorator function that registers the skill in the global registry. + """ + def decorator(func: SkillType) -> SkillType: + skill_registry.append({ + "name": name if name else func.__name__, # Use provided name or fallback to function name + "func": func, + "description": description + }) + return func + return decorator diff --git a/Agent_E/ae/core/system_orchestrator.py b/Agent_E/ae/core/system_orchestrator.py new file mode 100644 index 0000000..ce3103e --- /dev/null +++ b/Agent_E/ae/core/system_orchestrator.py @@ -0,0 +1,227 @@ +import asyncio +import json +import os +import time + +from dotenv import load_dotenv + +import Agent_E.ae.core.playwright_manager as browserManager +from Agent_E.ae.config import SOURCE_LOG_FOLDER_PATH +from Agent_E.ae.core.agents_llm_config import AgentsLLMConfig +from Agent_E.ae.core.autogen_wrapper import AutogenWrapper +from Agent_E.ae.utils.cli_helper import async_input # type: ignore +from Agent_E.ae.utils.formatting_helper import str_to_bool +from Agent_E.ae.utils.http_helper import make_post_request +from Agent_E.ae.utils.logger import logger + + +class SystemOrchestrator: + """ + Orchestrates the system's operation, handling input from both a command prompt and a web interface, + and coordinating between the Autogen wrapper and the Playwright manager. + + Attributes: + agent_scenario (str): The agent scenario to use for command processing. Defaults to "user_proxy,browser_nav_agent". + input_mode (str): The input mode of the system, determining whether command prompt input is enabled. Defaults to "GUI_ONLY". + browser_manager (PlaywrightManager): The Playwright manager instance for web interaction. + autogen_wrapper (AutogenWrapper): The Autogen wrapper instance for agent-based command processing. + is_running (bool): Flag indicating whether the system is currently processing a command. + shutdown_event (asyncio.Event): Event to wait for an exit command to be processed. + """ + + def __init__(self, agent_scenario:str="user,planner_agent,browser_nav_agent,browser_nav_executor", input_mode:str="GUI_ONLY", + planner_max_chat_round: int = 50, browser_nav_max_chat_round: int = 10): + """ + Initializes the system orchestrator with the specified agent scenario and input mode. + + Args: + agent_scenario (str, optional): The agent scenario to use for command processing. Defaults to "user_proxy,browser_nav_agent". + input_mode (str, optional): The input mode of the system. Defaults to "GUI_ONLY". + planner_max_chat_rounds (int, optional): The maximum number of chat rounds for the planner. Defaults to 50. + browser_nav_max_chat_round (int, optional): The maximum number of chat rounds for the browser navigation agent. Defaults to 10. + """ + load_dotenv() + self.planner_number_of_rounds = planner_max_chat_round + self.browser_number_of_rounds = browser_nav_max_chat_round + + self.agent_scenario = agent_scenario + self.input_mode = input_mode + self.browser_manager = None + self.autogen_wrapper = None + self.is_running = False + + self.save_chat_logs_to_files = str_to_bool(os.getenv('SAVE_CHAT_LOGS_TO_FILE', True)) + + if os.getenv('ORCHESTRATOR_API_KEY', None) is not None and os.getenv('ORCHESTRATOR_GATEWAY', None) is not None: + self.__populate_orchestrator_info() + logger.info(f"Orchestrator endpoint: {self.orchestrator_endpoint}") + else: + self.use_orchestrator = False + + self.__parse_user_and_browser_agent_names() + self.shutdown_event = asyncio.Event() #waits for an exit command to be processed + + + def __populate_orchestrator_info(self): + """ + Populates the orchestrator information by retrieving the API key, gateway, and endpoint from environment variables. + """ + self.orchestrator_api_key = os.getenv('ORCHESTRATOR_API_KEY') + self.orchestrator_gateway = os.getenv('ORCHESTRATOR_GATEWAY') + self.orchestrator_endpoint = f"{self.orchestrator_gateway}/api/orchestrate" + self.use_orchestrator = True + + + def __parse_user_and_browser_agent_names(self): + """ + Parse the user and browser agent names from agent_scenario + """ + self.agent_names = self.agent_scenario.split(',') + for agent_name in self.agent_names: + if 'user' in agent_name: + self.ser_agent_name = agent_name + elif 'planner' in agent_name: + self.planner_agent_name = agent_name + elif 'browser' in agent_name: + self.browser_agent_name = agent_name + + async def initialize(self): + """ + Initializes the components required for the system's operation, including the Autogen wrapper and the Playwright manager. + """ + # Load the configuration using AgentsLLMConfig + llm_config = AgentsLLMConfig() + + # Retrieve planner agent and browser nav agent configurations + self.planner_agent_config = llm_config.get_planner_agent_config() + self.browser_nav_agent_config = llm_config.get_browser_nav_agent_config() + + self.autogen_wrapper = await AutogenWrapper.create(self.planner_agent_config, self.browser_nav_agent_config, agents_needed=self.agent_names, + save_chat_logs_to_files=self.save_chat_logs_to_files, + planner_max_chat_round=self.planner_number_of_rounds, browser_nav_max_chat_round=self.browser_number_of_rounds) + + self.browser_manager = browserManager.PlaywrightManager(gui_input_mode=self.input_mode == "GUI_ONLY") + await self.browser_manager.async_initialize() + + if self.input_mode == "GUI_ONLY": + browser_context = await self.browser_manager.get_browser_context() + await browser_context.expose_function('process_task', self.receive_command) # type: ignore + + async def start(self): + """ + Starts the system orchestrator, initializing components and starting the command prompt loop if necessary. + """ + await self.initialize() + + if self.input_mode != "GUI_ONLY": + await self.command_prompt_loop() + + await self.wait_for_exit() + + async def command_prompt_loop(self): + """ + Continuously reads and processes commands from the command prompt until an 'exit' command is received. + """ + while not self.is_running: + command: str = await async_input("Enter your command (or type 'exit' to quit): ") # type: ignore + await self.process_command(command) # type: ignore + + async def receive_command(self, command: str): + """ + Callback function to process commands received from the web interface. + + Args: + command (str): The command received from the web interface. + """ + await self.process_command(command) + + async def __orchestrate_command(self, command: str): + if not self.use_orchestrator: + return command + + orch_response = make_post_request(self.orchestrator_endpoint, {"query": command}, self.orchestrator_api_key, api_key_header_name="X-API-Key") # type: ignore + + if not orch_response: + return command + + if "user_notification" in orch_response: + await self.browser_manager.notify_user(orch_response["user_notification"]) # type: ignore + if "is_terminating" in orch_response and orch_response["is_terminating"]: + logger.info("Orchestrator indicated command execution completed.") + return None + if "reformulated_query" in orch_response: + logger.info(f"Orchestrator reformulated command to: {orch_response['reformulated_query']}") + return orch_response["reformulated_query"] + + + async def process_command(self, command: str): + """ + Processes a given command, coordinating with the Autogen wrapper for execution and handling special commands like 'exit'. + + Args: + command (str): The command to process. + """ + logger.info(f"Received command: {command}") + if command.lower() == 'exit': + await self.shutdown() + return + + if command: + self.is_running = True + start_time = time.time() + current_url = await self.browser_manager.get_current_url() if self.browser_manager else None + self.browser_manager.ui_manager.clear_conversation_history() # type: ignore + self.browser_manager.log_user_message(command) # type: ignore + result = None + logger.info(f"Processing command: {command}") + if self.autogen_wrapper: + await self.browser_manager.update_processing_state("processing") # type: ignore + orchestrated_command = await self.__orchestrate_command(command) + if orchestrated_command is not None: + result = await self.autogen_wrapper.process_command(orchestrated_command, current_url) + else: + result = await self.autogen_wrapper.process_command(command, current_url) + + await self.browser_manager.update_processing_state("done") # type: ignore + end_time = time.time() + elapsed_time = round(end_time - start_time, 2) + logger.info(f"Command \"{command}\" took: {elapsed_time} seconds.") + await self.save_planner_chat_messages() + if result is not None: + chat_history= result.chat_history # type: ignore + last_message = chat_history[-1] if chat_history else None # type: ignore + if last_message and "terminate" in last_message and last_message["terminate"]=="yes": + await self.browser_manager.notify_user(last_message, "answer") # type: ignore + + await self.browser_manager.notify_user(f"Task Completed ({elapsed_time}s).", "info") # type: ignore + await self.browser_manager.command_completed(command, elapsed_time) # type: ignore + self.is_running = False + + async def save_planner_chat_messages(self): + """ + Saves the chat messages from the Autogen wrapper's agents to a JSON file. + """ + + messages = self.autogen_wrapper.agents_map[self.planner_agent_name].chat_messages # type: ignore + messages_str_keys = {str(key): value for key, value in messages.items()} # type: ignore + if self.save_chat_logs_to_files: + with open(os.path.join(SOURCE_LOG_FOLDER_PATH, 'chat_messages.json'), 'w', encoding='utf-8') as f: + json.dump(messages_str_keys, f, ensure_ascii=False, indent=4) + logger.debug("Chat messages saved") + else: + logger.info("Planner chat log: ", extra={"planner_chat_log": messages_str_keys}) # type: ignore + + async def wait_for_exit(self): + """ + Waits for an exit command to be processed, keeping the system active in the meantime. + """ + await self.shutdown_event.wait() # Wait until the shutdown event is set + + async def shutdown(self): + """ + Shuts down the system orchestrator, stopping the Playwright manager and exiting the command prompt loop. + """ + logger.info("Shutting down System Orchestrator...") + if self.browser_manager: + await self.browser_manager.stop_playwright() + self.shutdown_event.set() # Signal the shutdown event to stop waiting in wait_for_exit diff --git a/Agent_E/ae/core/ui_manager.py b/Agent_E/ae/core/ui_manager.py new file mode 100644 index 0000000..106a447 --- /dev/null +++ b/Agent_E/ae/core/ui_manager.py @@ -0,0 +1,221 @@ + +import os +import traceback + +from playwright.async_api import Frame +from playwright.async_api import Page + +from Agent_E.ae.config import PROJECT_SOURCE_ROOT +from Agent_E.ae.utils.js_helper import escape_js_message +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.ui_messagetype import MessageType + + +class UIManager: + """ + Manages the UI overlay for this application. The application uses playwright for the browser driver. + This includes handling navigation events, showing or hiding overlays, and maintaining + a conversation history within the UI overlay. + + Attributes: + overlay_is_collapsed (bool): Indicates if the overlay is currently collapsed. + conversation_history (list[dict[str, str]]): The chat history between user and system. Each entry contains 'from' and 'message' keys. + __update_overlay_chat_history_running (bool): A flag to prevent concurrent updates to the chat history. + """ + + overlay_is_collapsed: bool = True + + overlay_processing_state: str = "init" #init: initialised, processing: processing is ongoing, done: processing is done + overlay_show_details:bool = True + + conversation_history:list[dict[str, str]] = [] + __update_overlay_chat_history_running: bool = False + + + def __init__(self): + """ + Initializes the UIManager instance by adding default system messages to the conversation history. + """ + self.add_default_system_messages() + + + async def handle_navigation(self, frame: Frame): + """ + Handles navigation events by injecting JavaScript code into the frame to manage the overlay state + and updating the overlay chat history. + + Args: + frame (Frame): The Playwright Frame object to inject JavaScript into and manage. + """ + try: + await frame.wait_for_load_state("load") + overlay_injection_file = os.path.join(PROJECT_SOURCE_ROOT, "ui", "injectOverlay.js") + with open(overlay_injection_file, 'r') as file: # noqa: UP015 + js_code = file.read() + + # Inject the JavaScript code into the page + await frame.evaluate(js_code) + js_bool = str(self.overlay_show_details).lower() + if self.overlay_is_collapsed: + await frame.evaluate(f"showCollapsedOverlay('{self.overlay_processing_state}', {js_bool});") + else: + await frame.evaluate(f"showExpandedOverlay('{self.overlay_processing_state}', {js_bool});") + + #update chat history in the overlay + await self.update_overlay_chat_history(frame) + + except Exception as e: + if "Frame was detached" not in str(e): + raise e + + + async def show_overlay(self, page: Page): + """ + Displays the overlay in an expanded state on the given page if it's currently collapsed. + + Args: + page (Page): The Playwright Page object on which to show the overlay. + """ + if not self.overlay_is_collapsed: + logger.debug("Overlay is already expanded, ignoring show_overlay call") + return + await page.evaluate("showExpandedOverlay();") + self.overlay_is_collapsed = True + + + def update_overlay_state(self, is_collapsed: bool): + """ + Updates the state of the overlay to either collapsed or expanded. + + Args: + is_collapsed (bool): True to collapse the overlay, False to expand it. + """ + self.overlay_is_collapsed = is_collapsed + + + + async def update_overlay_show_details(self, show_details: bool, page: Page): + """ + Updates the state of the overlay to either show steps or not. + + Args: + show_steps (bool): True to show steps, False to hide them. + """ + self.overlay_show_details = show_details + await self.update_overlay_chat_history(page) + + + async def update_processing_state(self, state: str, page: Page): + """ + Updates the processing state of the overlay. + + Args: + state (str): The processing state to update. + """ + self.overlay_processing_state = state + try: + js_bool = str(self.overlay_is_collapsed).lower() + await page.evaluate(f"updateOverlayState('{self.overlay_processing_state}', {js_bool});") + except Exception as e: + logger.debug(f"JavaScript error: {e}") + + async def update_overlay_chat_history(self, frame_or_page: Frame | Page): + """ + Updates the chat history in the overlay. If the overlay is expanded and not currently being updated, + it clears existing messages and adds them fresh from the conversation history. + + Args: + frame_or_page (Frame | Page): The Playwright Frame or Page object to update the chat history in. + """ + logger.debug("Updating overlay chat history") + + if self.overlay_is_collapsed: + logger.debug("Overlay is collapsed, not updating chat history") + return + if self.__update_overlay_chat_history_running: + logger.debug("update_overlay_chat_history is already running, returning" + frame_or_page.url) + return + + self.__update_overlay_chat_history_running = True + #update chat history in the overlay by removing all messages and adding them again fresh + try: + await frame_or_page.evaluate("clearOverlayMessages();") + for message in self.conversation_history: + safe_message = escape_js_message(message["message"]) + safe_message_type = escape_js_message(message.get("message_type", MessageType.STEP.value)) + if message["from"] == "user": + await frame_or_page.evaluate(f"addUserMessage({safe_message});") + else: + #choose chich message types to be shown depending on UI setting + if self.overlay_show_details == False: # noqa: E712 + if message["message_type"] not in (MessageType.PLAN.value, MessageType.QUESTION.value, MessageType.ANSWER.value, MessageType.INFO.value): + continue + else: + if message["message_type"] not in (MessageType.PLAN.value, MessageType.QUESTION.value , MessageType.ANSWER.value, MessageType.INFO, MessageType.STEP.value): + continue + + js_code = f"addSystemMessage({safe_message}, is_awaiting_user_response=false, message_type={safe_message_type});" + await frame_or_page.evaluate(js_code) + logger.debug("Chat history updated in overlay, removing update lock flag") + except Exception: + traceback.print_exc() + finally: + self.__update_overlay_chat_history_running = False + + def clear_conversation_history(self): + """ + Clears the conversation history. + """ + self.conversation_history = [] + self.add_default_system_messages() + + def get_conversation_history(self): + """ + Returns the current conversation history. + + Returns: + list[dict[str, str]]: The conversation history. + """ + return self.conversation_history + + + def new_user_message(self, message: str): + """ + Adds a new user message to the conversation history. + + Args: + message (str): The message text to add. + """ + + self.conversation_history.append({"from":"user", "message":message}) + + + def new_system_message(self, message: str, type:MessageType=MessageType.STEP): + """ + Adds a new system message to the conversation history. + + Args: + message (str): The message text to add. + """ + + self.conversation_history.append({"from":"system", "message":message, "message_type":type.value}) + print(f"Adding system message: {message}") + + def add_default_system_messages(self): + """ + Adds default system messages to the conversation history to greet the user or provide initial instructions. + """ + pass + + async def command_completed(self, page: Page, command: str, elapsed_time: float|None = None): + """ + Handles the completion of a command, focusing on the overlay input and indicating that the command has finished. + + Args: + page (Page): The Playwright Page object where the command was executed. + command (str): The command that was completed. + elapsed_time (float | None, optional): The time taken to complete the command, if relevant. + """ + if not self.overlay_is_collapsed: + await page.evaluate("focusOnOverlayInput();") + await page.evaluate("commandExecutionCompleted();") diff --git a/Agent_E/ae/server/__init__.py b/Agent_E/ae/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Agent_E/ae/server/api_routes.py b/Agent_E/ae/server/api_routes.py new file mode 100644 index 0000000..4ec2735 --- /dev/null +++ b/Agent_E/ae/server/api_routes.py @@ -0,0 +1,191 @@ +import asyncio +import json +import logging +import os +import uuid +from queue import Empty +from queue import Queue +from typing import Any + +import uvicorn +from fastapi import FastAPI +from fastapi import Request +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import StreamingResponse +from pydantic import BaseModel +from pydantic import Field + +import Agent_E.ae.core.playwright_manager as browserManager +from Agent_E.ae.config import SOURCE_LOG_FOLDER_PATH +from Agent_E.ae.core.agents_llm_config import AgentsLLMConfig +from Agent_E.ae.core.autogen_wrapper import AutogenWrapper +from Agent_E.ae.utils.formatting_helper import is_terminating_message +from Agent_E.ae.utils.ui_messagetype import MessageType + +browser_manager = browserManager.PlaywrightManager(headless=False) + +APP_VERSION = "1.0.0" +APP_NAME = "Agent-E Web API" +API_PREFIX = "/api" +IS_DEBUG = False +HOST = os.getenv("HOST", "0.0.0.0") +PORT = int(os.getenv("PORT", 8080)) +WORKERS = 1 + +container_id = os.getenv("CONTAINER_ID", "") + +# Configure logging +logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") +logger = logging.getLogger("uvicorn") + + +class CommandQueryModel(BaseModel): + command: str = Field(..., description="The command related to web navigation to execute.") # Required field with description + llm_config: dict[str,Any] | None = Field(None, description="The LLM configuration string to use for the agents.") + planner_max_chat_round: int = Field(50, description="The maximum number of chat rounds for the planner.") + browser_nav_max_chat_round: int = Field(10, description="The maximum number of chat rounds for the browser navigation agent.") + clientid: str | None = Field(None, description="Client identifier, optional") + request_originator: str | None = Field(None, description="Optional id of the request originator") + + +def get_app() -> FastAPI: + """Starts the Application""" + fast_app = FastAPI(title=APP_NAME, version=APP_VERSION, debug=IS_DEBUG) + + fast_app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"]) + + return fast_app + + +app = get_app() + + +@app.on_event("startup") # type: ignore +async def startup_event(): + """ + Startup event handler to initialize browser manager asynchronously. + """ + global container_id + + if container_id.strip() == "": + container_id = str(uuid.uuid4()) + os.environ["CONTAINER_ID"] = container_id + await browser_manager.async_initialize() + + +@app.post("/execute_task", description="Execute a given command related to web navigation and return the result.") +async def execute_task(request: Request, query_model: CommandQueryModel): + notification_queue = Queue() # type: ignore + transaction_id = str(uuid.uuid4()) if query_model.clientid is None else query_model.clientid + register_notification_listener(notification_queue) + return StreamingResponse(run_task(request, transaction_id, query_model.command, browser_manager, notification_queue, query_model.request_originator,query_model.llm_config, + planner_max_chat_round=query_model.planner_max_chat_round, + browser_nav_max_chat_round=query_model.browser_nav_max_chat_round), media_type="text/event-stream") + + +def run_task(request: Request, transaction_id: str, command: str, playwright_manager: browserManager.PlaywrightManager, notification_queue: Queue, request_originator: str|None = None, llm_config: dict[str,Any]|None = None, # type: ignore + planner_max_chat_round: int = 50, browser_nav_max_chat_round: int = 10): + """ + Run the task to process the command and generate events. + + Args: + request (Request): The request object to detect client disconnect. + transaction_id (str): The transaction ID to identify the request. + command (str): The command to execute. + playwright_manager (PlaywrightManager): The manager handling browser interactions and notifications. + notification_queue (Queue): The queue to hold notifications for this request. + request_originator (str|None): The originator of the request. + llm_config (dict[str,Any]|None): The LLM configuration to use for the agents. + planner_max_chat_rounds (int, optional): The maximum number of chat rounds for the planner. Defaults to 50. + browser_nav_max_chat_round (int, optional): The maximum number of chat rounds for the browser navigation agent. Defaults to 10. + + Yields: + str: JSON-encoded string representing a notification. + """ + + async def event_generator(): + task = asyncio.create_task(process_command(command, playwright_manager, planner_max_chat_round, browser_nav_max_chat_round, llm_config)) + task_detail = f"transaction_id={transaction_id}, request_originator={request_originator}, command={command}" + + try: + while not task.done() or not notification_queue.empty(): + if await request.is_disconnected(): + logger.info(f"Client disconnected. Cancelling the task: {task_detail}") + task.cancel() + break + try: + notification = notification_queue.get_nowait() # type: ignore + notification["transaction_id"] = transaction_id # Include the transaction ID in the notification + notification["request_originator"] = request_originator # Include the request originator in the notification + yield f"data: {json.dumps(notification)}\n\n" # Using 'data: ' to follow the SSE format + except Empty: + await asyncio.sleep(0.1) + except asyncio.CancelledError: + logger.info(f"Task was cancelled due to client disconnection. {task_detail}") + except Exception as e: + logger.error(f"An error occurred while processing task: {task_detail}. Error: {e}") + + await task + except asyncio.CancelledError: + logger.info(f"Task was cancelled due to client disconnection. {task_detail}") + await task + + return event_generator() + + + +async def process_command(command: str, playwright_manager: browserManager.PlaywrightManager, planner_max_chat_round: int, browser_nav_max_chat_round: int, llm_config:dict[str,Any]|None = None): + """ + Process the command and send notifications. + + Args: + command (str): The command to process. + playwright_manager (PlaywrightManager): The manager handling browser interactions and notifications. + """ + await playwright_manager.go_to_homepage() # Go to the homepage before processing the command + current_url = await playwright_manager.get_current_url() + await playwright_manager.notify_user("Processing command", MessageType.INFO) + + # Load the configuration using AgentsLLMConfig + normalized_llm_config = None + if llm_config is None: + normalized_llm_config = AgentsLLMConfig() + else: + normalized_llm_config = AgentsLLMConfig(llm_config=llm_config) + logger.info("Applied LLM config received via API.") + + # Retrieve planner agent and browser nav agent configurations + planner_agent_config = normalized_llm_config.get_planner_agent_config() + browser_nav_agent_config = normalized_llm_config.get_browser_nav_agent_config() + + ag = await AutogenWrapper.create(planner_agent_config, browser_nav_agent_config, planner_max_chat_round=planner_max_chat_round, + browser_nav_max_chat_round=browser_nav_max_chat_round) + command_exec_result = await ag.process_command(command, current_url) # type: ignore + messages=ag.agents_map["planner_agent"].chat_messages + messages_str_keys = {str(key): value for key, value in messages.items()} # type: ignore + + with open(os.path.join(SOURCE_LOG_FOLDER_PATH, 'chat_messages.json'), 'w', encoding='utf-8') as f: + json.dump(messages_str_keys, f, ensure_ascii=False, indent=4) + logger.debug("Chat messages saved") + + if is_terminating_message(command_exec_result.summary): + await playwright_manager.notify_user("DONE", MessageType.DONE) + else: + await playwright_manager.notify_user("Max turns reached", MessageType.MAX_TURNS_REACHED) + + +def register_notification_listener(notification_queue: Queue): # type: ignore + """ + Register the event generator as a listener in the NotificationManager. + """ + + def listener(notification: dict[str, str]) -> None: + notification["container_id"] = container_id # Include the container ID (or UUID) in the notification + notification_queue.put(notification) # type: ignore + + browser_manager.notification_manager.register_listener(listener) + + +if __name__ == "__main__": + logger.info("**********Application Started**********") + uvicorn.run("main:app", host=HOST, port=PORT, workers=WORKERS, reload=IS_DEBUG, log_level="info") diff --git a/Agent_E/ae/ui/injectOverlay.js b/Agent_E/ae/ui/injectOverlay.js new file mode 100644 index 0000000..f707de3 --- /dev/null +++ b/Agent_E/ae/ui/injectOverlay.js @@ -0,0 +1,801 @@ +let awaitingUserResponse = false; // flag to check if the agent is awaiting user response + +// disabled and enabled styles as injected style element +function injectOveralyStyles() { + // Create a new style element + let style = document.createElement('style'); + // Set the styles + style.textContent = ` +@import url(https://fonts.googleapis.com/earlyaccess/notosanssc.css); + +::-webkit-scrollbar { + width: 6px; + border: solid 3px transparent; +} + +::-webkit-scrollbar-track { + background-color: transparent; +} + +::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.4); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.6); + } + + .agente-pre-line { + white-space: pre-line; !important; + } + + #agente-closebutton{ + width:30px; + height:30px; + min-width:30px; + min-height:30px; + margin-left: auto; + color:darkgray; + cursor: pointer; + background: transparent; + transition: transform 0.2s ease; + border: None; + } + #agente-closebutton:hover{ + transform: scale(1.1); + } + + #agente-closebutton:active{ + transform: scale(0.8); + } + + @keyframes agente-gradient-animation { + 0% {background-position: 100% 0%} + 100% {background-position: 15% 100%} + } + + @keyframes agente-rotate { + 100% { + transform: rotate(1turn); + } + } + + @keyframes automation_highlight_fadeout_animation { + 0% { border-color: rgba(128, 0, 128, 1); } + 50% { border-color: rgba(128, 0, 128, 1); } + 100% { border-color: rgba(128, 0, 128, 0); } + } + + .agente-ui-automation-highlight { + border-width: 2px !important; + border-style: solid !important; + animation: automation_highlight_fadeout_animation 5s linear 1 forwards !important; + } + + .agente-processing{ + background: linear-gradient(90deg, + rgba(255, 0, 255, 1) 0%, /* Bright Magenta */ + rgba(0, 191, 255, 1) 100% /* Deep Sky Blue */ + ); + background-size: 100% 200%; + animation: agente-rotate 1s linear infinite; + } + + .agente-init{ + background: darkgray; + box-shadow: rgba(120, 120, 120, 0.3) 0px 0px 20px + } + + .agente-done{ + background: lightgreen; + } + + .agente-processingLine { + background: linear-gradient(45deg, + rgba(255, 0, 0, 1) 0%, /* Red */ + rgba(255, 127, 0, 1) 25%, /* Orange */ + rgba(0, 255, 0, 1) 50%, /* Green */ + rgba(0, 0, 255, 1) 75%, /* Blue */ + rgba(255, 0, 0, 1) 90%, /* Red */ + rgba(255, 0, 0, 1) 100% /* Red */ + ); + background-size: 500% 100%; + animation: agente-gradient-animation 3s linear infinite; + } + + .agente-initStateLine{ + background: lightgray; + } + + .agente-doneStateLine{ + background: lightgreen; + } + + .agente-collapsed{ + cursor: pointer; + background-color: rgba(0, 0, 0, 0.1); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + width: 6vh; + height: 6vh; + border-radius: 50%; + right: 1.5vw; + bottom: 1.5vw; + box-shadow: rgba(0, 0, 0, 0.3) 0px 0px 20px + } + + .agente-chat-container { + margin:1%,1%,1%,1%; + width: 30vw; + min-width: 350px; + height:70vh; + bottom: 2vh; + position: relative; + display: flex; + flex-direction: column; + top: 6%; + padding: 1%; + box-sizing: border-box; + } + + .agente-chat-input{ + display: flex; + flex-direction: row; + align-items: center; + width: 95%; + margin-top:1.5vh; + } + + .agente-agent{ + justify-content: flex-start; + } + + .agente-user{ + justify-content: flex-end; + } + + #agente-user-input { + flex: 1; + padding: 3px 3px; + border: transparent; + width:100%; + resize: none; + font-family: 'Noto Sans SC'; + font-size: 1.6vh; + min-font-size: 12px; + line-height: 1.5; + display: flex; + vertical-align: middle; + text-align: middle; + align-items: center; + justify-content: center; + border-color: #ccc; + background: white; + color:black; + min-height: calc(1.2em * 2); + scrollbar-width: thin; + } + + #agente-user-input:focus { + outline: none !important; + border:0px solid transparent !important; + box-shadow: none !important; + } + + #agente-send-btn { + cursor: pointer; + transition: transform 0.2s ease; + } + + #agente-send-btn:hover{ + transform: scale(1.1); + } + + .agente-highlight_overlay{ + box-shadow: 1px 1px 1px 1px rgb(50 50 50 / 40%); + border-radius: 16px; + border: 1px solid #E1DEE2; + bottom:3px; + right:5px; + background: #FBFAFA; + } + + #agente-chat-box { + overflow-y: auto; + scrollbar-width: thin; + height: 90%; + display: flex; + flex-direction: column; + gap:1%; + margin:1% 5%; + padding-bottom:1%; + margin-top:10%; + } + + #agente-overlay { + position: fixed; + min-width: 50px; + min-height: 50px; + margin-left: auto; + margin-right: auto; + z-index:20000000; + scrollbar-color: gray lightgray; + margin-bottom: 1%; + display: flex; + flex-direction: column; + } + + .agente-input-container { + display: flex; + flex-direction: column; + margin: 1% 3%; + padding: 1%; + height:20%; + background: white; + border: 1px solid #E1DEE2; + border-radius: 8px; + } + + .agente-chat{ + width: 80%; + color: black; + overflow-wrap: break-word; + font-family: 'Noto Sans SC'; + + } + + .agente-systemMessage{ + text-align: left; + justify-content: flex-start; + font-family: 'Noto Sans SC'; + padding: 2% 4%; + font-size: 1.5vh; + min-font-size: 12px; + min-height: 30px; + background: #EEEEEF; + line-height: 1.7; + border-radius: 10px; + width:auto; + max-width: 90%; + } + + .agente-usertext{ + text-align: right; + justify-content: flex-end; + align-items: flex-end; + font-family: 'Noto Sans SC'; + font-size: 1.5vh; + min-font-size: 12px; + padding: 2% 4%; + line-height: 1.7; + min-height: 30px; + width:auto; + background: #ECEBF3; + border-radius: 10px; + color: black; + } + + .agente-agentstep{ + color: #4B4B4B; + } + .agente-agentplan{ + color: #4B4B4B; + } + .agente-agentanswer{ + color: black; + } + + + .agente-toggle { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin: 0; + display: inline-block; + position: relative; + border-radius: 50px; + overflow: hidden; + outline: none; + border: none; + cursor: pointer; + background-color: #E1DEE2; + transition: background-color ease 0.3s; + align-self: center; +} +.agente-toggle:focus { + border: none; !important; + outline: none; !important; +} +.agente-toggle:before { + content: ""; + display: block; + position: absolute; + z-index: 2; + width: 20px; + height: 20px; + background: #fff; + left: 2px; + top: 2px; + border-radius: 50%; + color: #fff; + text-shadow: -1px -1px rgba(0,0,0,0.15); + white-space: nowrap; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); + transition: all cubic-bezier(0.3, 1.5, 0.7, 1) 0.3s; +} + +.agente-toggle:checked { + background-color: #786E96; +} + +.agente-toggle:checked:before { + left: 20px; +} +`; + // Append the style element to the head of the document + document.head.appendChild(style); +} +let savedSelection = null; +let show_details = true; + + +function showCollapsedOverlay(processing_state = "processing", steps) { + show_details = steps; + removeOverlay(); + window.overlay_state_changed(true); + let collapsed_agente = document.createElement("div"); + collapsed_agente.id = "agente-overlay"; + collapsed_agente.classList.add("agente-collapsed"); + collapsed_agente.style.backgroundColor = "transparent"; + collapsed_agente.setAttribute("aria-hidden", "true"); + collapsed_agente.style.justifyContent = "center"; + let wrapper = document.createElement("div"); + wrapper.style.position = "relative"; + wrapper.style.width = "100%"; + wrapper.style.height = "100%"; + wrapper.style.justifyContent = "center"; + let logodiv= document.createElement("div"); + logodiv.style.width = "90%"; + logodiv.style.height = "90%"; + logodiv.style.left = "5%"; + logodiv.style.top = "5%"; + let borderdiv = document.createElement("div"); + borderdiv.style.width = "100%"; + borderdiv.style.height = "100%"; + borderdiv.style.borderRadius = "50%"; + + let logo = ``; + let encodedSvg = encodeURIComponent(logo); + let svgUrl = 'data:image/svg+xml;utf8,' + encodedSvg; + logodiv.style.backgroundImage = `url("${svgUrl}")`; + logodiv.style.backgroundRepeat = "no-repeat"; + logodiv.style.backgroundSize = "contain"; + logodiv.style.borderRadius = "50%"; + logodiv.style.backgroundPosition = "center"; + logodiv.style.backgroundColor = "white"; + logodiv.style.alignSelf = "center"; + borderdiv.style.position = "absolute"; + borderdiv.style.top = "0"; + borderdiv.style.left = "0"; + borderdiv.id="AgentEOverlayBorder"; + logodiv.style.position = "absolute"; + logodiv.style.justifySelf = "center"; + wrapper.appendChild(borderdiv); + wrapper.appendChild(logodiv); + collapsed_agente.appendChild(wrapper); + document.body.appendChild(collapsed_agente); + + updateOverlayState(processing_state, true); + + let element = document.getElementById('agente-overlay'); + document.getElementById('agente-overlay').addEventListener('mouseover', function () { + this.style.transform = 'scale(1.1)'; + }); + + document.getElementById('agente-overlay').addEventListener('mouseout', function () { + this.style.transform = 'scale(1)'; + }); + document.getElementById('agente-overlay').addEventListener('click', function () { + let ui_state = document.getElementById("AgentEOverlayBorder").classList.contains("agente-init") ? "init" : document.getElementById("AgentEOverlayBorder").classList.contains("agente-processing") ? "processing" : "done"; + showExpandedOverlay(ui_state, show_details); + }); +} + +function removeOverlay() { + let element = document.getElementById("agente-overlay"); + if (element) { + element.parentNode.removeChild(element); + } +} + +function clearOverlayMessages(keep_default=false) { + try { + let chatBox = document.getElementById('agente-chat-box'); + if (!chatBox) { + return; + } + while (chatBox.firstChild) { + chatBox.removeChild(chatBox.firstChild); + } + } catch (error) { + //No action can be taken at this point. Just ensure subsequent messages are not affected + console.error("Error clearing chat box", error); + } +} + +function updateOverlayState(processing_state, is_collapsed) +{ + if (is_collapsed) { + let borderdiv = document.getElementById("AgentEOverlayBorder"); + if (processing_state === "init"){ + borderdiv.classList.add("agente-init"); + borderdiv.classList.remove("agente-processing"); + borderdiv.classList.remove("agente-done"); + } + else if (processing_state === "processing"){ + borderdiv.classList.remove("agente-init"); + borderdiv.classList.add("agente-processing"); + borderdiv.classList.remove("agente-done"); + } + else if (processing_state === "done"){ + borderdiv.classList.remove("agente-init"); + borderdiv.classList.remove("agente-processing"); + borderdiv.classList.add("agente-done"); + } + } else { + let animation = document.getElementById("AgentEExpandedAnimation"); + if (processing_state === "init"){ + animation.classList.remove("agente-processingLine"); + animation.classList.add("agente-initStateLine"); + animation.classList.remove("agente-doneStateLine"); + enableOverlay(); + } + else if (processing_state === "processing"){ + animation.classList.add("agente-processingLine"); + animation.classList.remove("agente-initStateLine"); + animation.classList.remove("agente-doneStateLine"); + disableOverlay(); + } + else if (processing_state === "done"){ + animation.classList.remove("agente-processingLine"); + animation.classList.remove("agente-initStateLine"); + animation.classList.add("agente-doneStateLine"); + enableOverlay(); + } + } +} + +function showExpandedOverlay(processing_state = "init", show_steps=true) { + ui_state = processing_state; + show_details = show_steps; + let agente_logo = ``; + let close_icon = ``; + let icon = ``; + removeOverlay(); + window.overlay_state_changed(false); + let newDiv = document.createElement("div"); + newDiv.id = "agente-overlay"; + newDiv.classList.add("agente-highlight_overlay"); + newDiv.setAttribute("aria-hidden", "true"); + newDiv.setAttribute("tabindex", "0"); + + let header = document.createElement("div"); + header.style.display = "flex"; + header.style.flexDirection = "row"; + header.style.margin = "4%"; + + let logoIcon= document.createElement("div"); + logoIcon.style.width = "25px"; + logoIcon.style.height = "25px"; + logoIcon.style.backgroundImage = `url('data:image/svg+xml;utf8,${encodeURIComponent(icon)}')`; + logoIcon.style.backgroundRepeat = "no-repeat"; + logoIcon.style.backgroundSize = "contain"; + logoIcon.style.backgroundPosition = "bottom"; + logoIcon.style.order = 1; + logoIcon.style.alignSelf = "flex-end"; + logoIcon.style.marginRight = "1%"; + + let logoDiv = document.createElement("div"); + logoDiv.style.width = "100px"; + logoDiv.style.height = "25px"; + logoDiv.style.backgroundImage = `url('data:image/svg+xml;utf8,${encodeURIComponent(agente_logo)}')`; + logoDiv.style.backgroundRepeat = "no-repeat"; + logoDiv.style.backgroundSize = "contain"; + logoDiv.style.backgroundPosition = "bottom"; + // Style the logoDiv and button + logoDiv.style.order = 1; + + + let closeButton = document.createElement("button"); + closeButton.id = "agente-closebutton"; + closeButton.style.backgroundImage = `url('data:image/svg+xml;utf8,${encodeURIComponent(close_icon)}')`; + closeButton.style.backgroundRepeat = "no-repeat"; + closeButton.style.backgroundSize = "contain"; + closeButton.style.backgroundPosition = "bottom"; + closeButton.onclick = function () { + let ui_state = document.getElementById("AgentEExpandedAnimation").classList.contains("agente-initStateLine") ? "init" : document.getElementById("AgentEExpandedAnimation").classList.contains("agente-processingLine") ? "processing" : "done"; + showCollapsedOverlay(ui_state, show_details); + }; + closeButton.style.order = 3; + header.appendChild(logoIcon); + header.appendChild(logoDiv); + let animation = document.createElement("div"); + animation.id = "AgentEExpandedAnimation"; + animation.style.height = "2px"; + animation.style.width = "100%"; + + header.appendChild(closeButton); + // Append the close button to the newDiv + newDiv.appendChild(header); + + + newDiv.appendChild(animation); + let chatContainer = document.createElement("div"); + chatContainer.className = "agente-chat-container"; + + let chatBox = document.createElement("div"); + chatBox.id = "agente-chat-box"; + + let chatInput = document.createElement("div"); + chatInput.className = "agente-chat-input"; + chatBox.appendChild(chatInput); + + let inputContainer = document.createElement("div"); + inputContainer.className = "agente-input-container"; + inputContainer.id = "agente-input-container"; + let userInput = document.createElement("textarea"); + userInput.id = "agente-user-input"; + userInput.placeholder = "What can I help you solve today?"; + userInput.addEventListener('input', function(event) { + let text = event.target.value; + if (text.trim() == "") { + let button_disabled_svg =``; + let sendBtn = document.getElementById('agente-send-btn'); + sendBtn.style.backgroundImage = `url('data:image/svg+xml;utf8,${encodeURIComponent(button_disabled_svg)}')`; + } + else{ + let button_enabled_svg= ``; + let sendBtn = document.getElementById('agente-send-btn'); + sendBtn.style.backgroundImage = `url('data:image/svg+xml;utf8,${encodeURIComponent(button_enabled_svg)}')`; + } + }); + let userinput_footer = document.createElement("div"); + userinput_footer.style.display = "flex"; + userinput_footer.style.flexDirection = "row"; + userinput_footer.style.justifyContent = "space-between"; + userinput_footer.style.alignItems = "center"; + userinput_footer.style.height = "40%"; + userinput_footer.style.margin = "2% 1%"; + userinput_footer.id="userinput_section" + + let toggleLabel = document.createElement("label"); // Create a new label element + toggleLabel.textContent = "Show Details"; // Set the text content of the label + toggleLabel.style.color = "#6B6673"; // Set the color of the label + toggleLabel.style.fontFamily = "Noto Sans SC"; // Set the font of the label + toggleLabel.style.fontSize = "14px"; // Set the font size of the label + toggleLabel.style.fontWeight = "400"; // Set the font weight of the label + toggleLabel.style.margin = "0px"; // Add some margin to the right of the label + toggleLabel.style.marginRight = "10px"; // Add some margin to the right of the label + + let toggleSwitch = document.createElement("input"); + + toggleSwitch.type = "checkbox"; + toggleSwitch.className = "agente-toggle"; + toggleSwitch.style.width = "44px"; + toggleSwitch.style.height = "24px"; + toggleSwitch.style.margin = "0px"; + + if (show_details){ + toggleSwitch.checked = true; + } + else{ + toggleSwitch.checked = false; + } + + toggleSwitch.addEventListener('change', function() { + if(this.checked) { + show_details = true; + window.show_steps_state_changed(true) + } else { + show_details = false; + window.show_steps_state_changed(false) + } +}); + + let sendicon =``; + let sendBtn = document.createElement("div"); + sendBtn.id = "agente-send-btn"; + sendBtn.style.backgroundImage = `url('data:image/svg+xml;utf8,${encodeURIComponent(sendicon)}')`; + sendBtn.style.backgroundRepeat = "no-repeat"; + sendBtn.style.backgroundSize = "contain"; + sendBtn.style.backgroundPosition = "right"; + sendBtn.style.width = "8%"; + sendBtn.style.height = "100%"; + sendBtn.style.marginLeft = "auto"; + + userinput_footer.appendChild(toggleLabel); // Add the label to the div + userinput_footer.appendChild(toggleSwitch); + userinput_footer.appendChild(sendBtn); + + inputContainer.appendChild(userInput); + inputContainer.appendChild(userinput_footer); + + chatContainer.appendChild(chatBox); + chatContainer.appendChild(inputContainer); + + newDiv.appendChild(chatContainer); + + let disclaimer = document.createElement("p"); + disclaimer.style.fontFamily = "Noto Sans SC"; + disclaimer.style.fontSize = "12px"; + disclaimer.style.color = "#6B6673"; + disclaimer.style.alignSelf = "center"; + disclaimer.style.position = "absolute"; + disclaimer.style.bottom = "0%"; + disclaimer.style.margin = "0% 0% 1% 0%"; + disclaimer.textContent = "Agent-E may make mistakes. Verify key info."; + + newDiv.appendChild(disclaimer); + + document.body.appendChild(newDiv); + updateOverlayState(processing_state, false); + document.getElementById('agente-send-btn').addEventListener('click', function () { + let task = document.getElementById('agente-user-input').value + let task_trimmed = task.trim(); + if (task_trimmed && !isDisabled() && task_trimmed.length > 0) { + if (awaitingUserResponse) { + addUserMessage(task); + document.getElementById('agente-user-input').value = ""; + } else { + clearOverlayMessages(); + addUserMessage(task); + disableOverlay(); + window.process_task(task) + document.getElementById('agente-user-input').value = ""; + } + } + else { + console.log("Empty message no task to send"); + } + }); + + userInput.addEventListener('focus', function() { + if (window.getSelection().rangeCount > 0) { + let selectedText = window.getSelection().toString(); + if (selectedText) { + document.getElementById('agente-user-input').value = selectedText + '\n'; + setTimeout(function() { + userInput.selectionStart = userInput.selectionEnd = userInput.value.length; + userInput.scrollTop = userInput.scrollHeight; + }, 0); + + } + } +}); + +userInput.addEventListener('blur', function() { + if (savedSelection) { + let selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(savedSelection); + } +}); + + document.getElementById('agente-user-input').addEventListener('keydown', function (event) { + // Check if the pressed key is the Enter key + if (event.key === "Enter") { + event.preventDefault(); + + let targetElement = document.getElementById('agente-send-btn'); + + // Create a new click event + let clickEvent = new MouseEvent('click', { + bubbles: true, + cancelable: true + }); + + // Dispatch the click event on the send button + targetElement.dispatchEvent(clickEvent); + } + }); + focusOnOverlayInput(); +} + + +function focusOnOverlayInput() { + document.getElementById('agente-user-input').focus(); +} + +function addMessage(message, sender, message_type = "plan") { + let newDiv = document.createElement("div"); + newDiv.classList.add("agente-chat-input"); + let chatDiv = document.createElement("div"); + chatDiv.classList.add("agente-chat"); + + let parsedMessage = message; + + try { + parsedMessage = JSON.parse(message); + } catch (e) { + console.log("Message is not in JSON format, using original message."); + } + + // Customize based on the sender + if (sender === "system") { + newDiv.classList.add("agente-agent"); + chatDiv.classList.add("agente-systemMessage", "agente-pre-line"); + if (message_type === "step") { + chatDiv.classList.add("agente-agentstep"); + } + else if (message_type === "plan" || message_type === "question") { + chatDiv.classList.add("agente-agentplan"); + } + + else if (message_type === "answer") { + chatDiv.classList.add("agente-agentanswer"); + } + if ((message_type === "info" && message.includes("Task Completed")) || message_type==="question") { + enableOverlay(); + } + chatDiv.textContent = parsedMessage; + } else if (sender === "user") { + newDiv.classList.add("agente-user") + chatDiv.classList.add("agente-usertext", "agente-pre-line"); + chatDiv.textContent = parsedMessage; + } + newDiv.appendChild(chatDiv); + let chatBox = document.getElementById('agente-chat-box'); + chatBox.appendChild(newDiv); + chatBox.scrollTop = chatBox.scrollHeight; + newDiv.scrollIntoView({ behavior: 'instant' }); + + if (sender === "user" && awaitingUserResponse) { + awaitingUserResponse = false; + // Notify the server that the user has responded to the agent's prompt + window.user_response(message); + } + +} + +function addSystemMessage(message, is_awaiting_user_response = false, message_type = "plan") { + // Function to actually add the message + function executeAddMessage() { + awaitingUserResponse = is_awaiting_user_response; + addMessage(message, "system", message_type); + } + requestAnimationFrame(executeAddMessage); +} + +function addUserMessage(message) { + addMessage(message, "user"); +} + +function disableOverlay() { + let input_field= document.getElementById("agente-user-input"); + if(input_field){ + input_field.placeholder = "Processing..."; + } +} + +function isDisabled() { + let input_field= document.getElementById("agente-user-input"); + if(input_field){ + return input_field.placeholder === "Processing..."; + } +} + + +function enableOverlay() { + let input_field= document.getElementById("agente-user-input"); + if(input_field){ + input_field.placeholder = "What can I help you solve today?"; + } +} + +function commandExecutionCompleted() { + console.log("Command execution completed"); +} + +injectOveralyStyles(); diff --git a/Agent_E/ae/user_preferences/user_preferences.txt b/Agent_E/ae/user_preferences/user_preferences.txt new file mode 100644 index 0000000..3a96bd9 --- /dev/null +++ b/Agent_E/ae/user_preferences/user_preferences.txt @@ -0,0 +1,11 @@ +Personal Info: +First Name: John +Last Name: Doe +Date of birth: 10/10/2010 +Occupation: Software Engineer +Address: 49 Featherstone Street, LONDON, EC1Y 8SY, UNITED KINGDOM +Email: myemail@gmail.com +Phone Number: 123-456-7890 +Here are some of my preferences: +Favorite news source: www.bbc.com +Favorite flight booking site to use with every flight related query: https://www.google.com/travel/flights \ No newline at end of file diff --git a/Agent_E/ae/utils/__init__.py b/Agent_E/ae/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Agent_E/ae/utils/anthropic_llm_helper.py b/Agent_E/ae/utils/anthropic_llm_helper.py new file mode 100644 index 0000000..6fbc870 --- /dev/null +++ b/Agent_E/ae/utils/anthropic_llm_helper.py @@ -0,0 +1,52 @@ +import os + +import anthropic +from anthropic import AsyncAnthropic +from dotenv import load_dotenv + + +class AnthropicLLMHelper: + def __init__(self): + load_dotenv() + self.client = AsyncAnthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) + + async def get_chat_completion_response_async(self, system_msg:str, user_msgs:list[str], model_name:str="claude-3-opus-20240229", temperature:float=0.1, max_tokens:int=256, top_p:int=1, top_k: int=1) -> str: + formatted_user_msgs: list[dict[str, str]] = [] + for user_msg in user_msgs: + formatted_user_msgs.append({"type": "text", "text": user_msg}) + + try: + message = await self.client.messages.create( + model=model_name, + max_tokens=max_tokens, + temperature=temperature, + system=system_msg, + messages=[ + { + "role": "user", + "content": formatted_user_msgs # type: ignore + + } + ] + ) + print(message) + return message.content[0].text + except anthropic.APIConnectionError as e: + print("The server could not be reached") + print(e.__cause__) # an underlying Exception, likely raised within httpx. + raise Exception(f"Calling {model_name} LLM failed. The server could not be reached. Error: {e}") # noqa: B904 + except anthropic.RateLimitError as e: + print("A 429 status code was received; we should back off a bit.") + raise Exception(f"Calling {model_name} LLM failed. Rate limit error. Error: {e}") # noqa: B904 + except anthropic.APIStatusError as e: + print(e.status_code) + print(e.response) + raise Exception(f"Calling {model_name} LLM failed. Error: {e}") # noqa: B904 + +# async def main(): +# from ae.core.prompts import LLM_PROMPTS +# helper = AnthropicLLMHelper() +# response = await helper.get_chat_completion_response_async(LLM_PROMPTS["SKILLS_HARVESTING_PROMPT"], ["What is the weather like today?"], temperature=0, max_tokens=4000) +# print("*******\nResponse: ", response, "\n*******\n") + +# asyncio.run(main()) diff --git a/Agent_E/ae/utils/autogen_sequential_function_call.py b/Agent_E/ae/utils/autogen_sequential_function_call.py new file mode 100644 index 0000000..9d08443 --- /dev/null +++ b/Agent_E/ae/utils/autogen_sequential_function_call.py @@ -0,0 +1,85 @@ + +import asyncio +import inspect +from typing import Any + +from autogen import Agent # type: ignore +from autogen import UserProxyAgent # type: ignore + + +class UserProxyAgent_SequentialFunctionExecution(UserProxyAgent): + def __init__(self, *args, **kwargs): # type: ignore + super().__init__(*args, **kwargs) # type: ignore + #position = 2 allows termination check to be called earlier, this helps detect loops. + self.register_reply(Agent, UserProxyAgent_SequentialFunctionExecution.sequential_generate_tool_calls_reply, position=2) # type: ignore + + + def sequential_generate_tool_calls_reply( # type: ignore + self, + messages: list[dict] | None = None, # type: ignore + sender: Agent | None = None, + config: Any | None = None, + ) -> tuple[bool, dict[str, Any] | None]: + """Generate a reply using tool call.""" + if config is None: + config = self + if messages is None: + messages = self._oai_messages[sender] # type: ignore + message = messages[-1] # type: ignore + tool_returns = [] + skip_flag:bool = False + for tool_call in message.get("tool_calls", []): # type: ignore + function_call = tool_call.get("function", {}) # type: ignore + func = self._function_map.get(function_call.get("name", None), None) # type: ignore + func_return = None + if inspect.iscoroutinefunction(func): # type: ignore + try: + # get the running loop if it was already created + loop = asyncio.get_running_loop() + close_loop = False + except RuntimeError: + # create a loop if there is no running loop + loop = asyncio.new_event_loop() + close_loop = True + if (not skip_flag): + _, func_return = loop.run_until_complete(self.a_execute_function(function_call)) # type: ignore + if close_loop: + loop.close() + else: + if (not skip_flag): + _, func_return = self.execute_function(function_call) # type: ignore + if func_return is None: # type: ignore + if skip_flag: + content = "VERY IMPORTANT: This function could not be executed since previous function resulted in a Webpage change. You must get all_fields DOM and repeat the function if needed." + else: + content = "" + else: + content = func_return.get("content", "") # type: ignore + + if content is None: + content = "" + + if ("as a consequence of this action" in content.lower()): # type: ignore + skip_flag = True + + tool_call_id = tool_call.get("id", None) # type: ignore + if tool_call_id is not None: + tool_call_response = { # type: ignore + "tool_call_id": tool_call_id, + "role": "tool", + "content": content, + } + else: + tool_call_response = { # type: ignore + "role": "tool", + "content": content, + } + tool_returns.append(tool_call_response) # type: ignore + + if tool_returns: + return True, { + "role": "tool", + "tool_responses": tool_returns, + "content": "\n\n".join([self._str_for_tool_response(tool_return) for tool_return in tool_returns]), # type: ignore + } + return False, None diff --git a/Agent_E/ae/utils/cli_helper.py b/Agent_E/ae/utils/cli_helper.py new file mode 100644 index 0000000..4c153ce --- /dev/null +++ b/Agent_E/ae/utils/cli_helper.py @@ -0,0 +1,34 @@ +import asyncio +from asyncio import Future + + +def async_input(prompt: str) -> Future: # type: ignore + """ + Display a prompt to the user and wait for input in an asynchronous manner. + + Parameters: + - prompt: The message to display to the user. + + Returns: + - A Future object that will be fulfilled with the user's input. + """ + loop = asyncio.get_event_loop() + return loop.run_in_executor(None, input, prompt) + + +async def answer_questions_over_cli(questions: list[str]) -> dict[str, str]: + """ + Asks a question over the command line and awaits the user's response. + + Parameters: + - questions: A list of questions to ask the user, e.g., ["What is your favorite site?", "What do you want to search for?"]. + + Returns: + - A dictionary where each key is a question and each value is the user's response. + """ + answers: dict[str, str] = {} + print("*********************************") + for question in questions: + answers[question] = await async_input("Question: "+str(question)+" : ") + print("*********************************") + return answers diff --git a/Agent_E/ae/utils/detect_llm_loops.py b/Agent_E/ae/utils/detect_llm_loops.py new file mode 100644 index 0000000..e73f1f0 --- /dev/null +++ b/Agent_E/ae/utils/detect_llm_loops.py @@ -0,0 +1,46 @@ +from typing import Any + +from Agent_E.ae.utils.logger import logger + + +def is_agent_stuck_in_loop(messages: list[dict[str, Any]]) -> bool: + """ + Detects loops in the agent's responses by iterating over the last N responses. + + Parameters + ---------- + messages : list[dict[str, Any]] + A list of dictionaries representing the agent's messages. + + Returns + ------- + bool + True if a loop is detected, False otherwise. + """ + number_of_turns_to_check_for_loops: int = 6 + number_of_rounds_to_check_for_loops: int = number_of_turns_to_check_for_loops // 2 #integer division since we are checking for pairs of messages and can't have fractions + # Detect any loops by checking the last number_of_rounds_to_check_for_loops tool responses and their corresponding tool calls + if len(messages) > number_of_turns_to_check_for_loops: + last_six_items = messages[-number_of_turns_to_check_for_loops:] + logger.debug(f"More than {number_of_turns_to_check_for_loops} messages in the conversation. Checking for loops..") + # Filter items by role + tool_calls = [item for item in last_six_items if item.get("role") == "assistant"] + + # Check if function attributes are the same for tool items + if tool_calls: + tool_functions = [item.get("tool_calls", [{}])[0].get("function") for item in tool_calls] + logger.debug(f"Last {number_of_rounds_to_check_for_loops} tool calls: {tool_functions}") + if all(func == tool_functions[0] for func in tool_functions): + logger.debug(f"Last {number_of_rounds_to_check_for_loops} tool calls are identical. Checking Tool responses..") + # Check if content attributes are the same for assistant items + tool_responses = [item for item in last_six_items if item.get("role") == "tool"] + + if tool_responses: + assistant_contents = [item.get("content") for item in tool_responses] + logger.debug(f"Last N tool responses: {assistant_contents}") + if all(content == assistant_contents[0] for content in assistant_contents): + logger.debug(f"Last {number_of_rounds_to_check_for_loops} tool responses are identical. Terminating") + logger.info("Terminating browser executor since a loop was detected...") + return True + + return False diff --git a/Agent_E/ae/utils/dom_helper.py b/Agent_E/ae/utils/dom_helper.py new file mode 100644 index 0000000..40c371c --- /dev/null +++ b/Agent_E/ae/utils/dom_helper.py @@ -0,0 +1,45 @@ +import asyncio + +from playwright.async_api import ElementHandle +from playwright.async_api import Page + +from Agent_E.ae.utils.logger import logger + + +async def wait_for_non_loading_dom_state(page: Page, max_wait_millis: int): + max_wait_seconds = max_wait_millis / 1000 + end_time = asyncio.get_event_loop().time() + max_wait_seconds + while asyncio.get_event_loop().time() < end_time: + dom_state = await page.evaluate("document.readyState") + if dom_state != "loading": + logger.debug(f"DOM state is not 'loading': {dom_state}") + break # Exit the loop if the DOM state is not 'loading' + + await asyncio.sleep(0.05) + + +async def get_element_outer_html(element: ElementHandle, page: Page, element_tag_name: str|None = None) -> str: + """ + Constructs the opening tag of an HTML element along with its attributes. + + Args: + element (ElementHandle): The element to retrieve the opening tag for. + page (Page): The page object associated with the element. + element_tag_name (str, optional): The tag name of the element. Defaults to None. If not passed, it will be retrieved from the element. + + Returns: + str: The opening tag of the HTML element, including a select set of attributes. + """ + tag_name: str = element_tag_name if element_tag_name else await page.evaluate("element => element.tagName.toLowerCase()", element) + + attributes_of_interest: list[str] = ['id', 'name', 'aria-label', 'placeholder', 'href', 'src', 'aria-autocomplete', 'role', 'type', + 'data-testid', 'value', 'selected', 'aria-labelledby', 'aria-describedby', 'aria-haspopup'] + opening_tag: str = f'<{tag_name}' + + for attr in attributes_of_interest: + value: str = await element.get_attribute(attr) # type: ignore + if value: + opening_tag += f' {attr}="{value}"' + opening_tag += '>' + + return opening_tag diff --git a/Agent_E/ae/utils/dom_mutation_observer.py b/Agent_E/ae/utils/dom_mutation_observer.py new file mode 100644 index 0000000..95a6f5e --- /dev/null +++ b/Agent_E/ae/utils/dom_mutation_observer.py @@ -0,0 +1,88 @@ + +import asyncio +import json +from typing import Callable # noqa: UP035 + +from playwright.async_api import Page + +# Create an event loop +loop = asyncio.get_event_loop() + +DOM_change_callback: list[Callable[[str], None]] = [] + +def subscribe(callback: Callable[[str], None]) -> None: + DOM_change_callback.append(callback) + +def unsubscribe(callback: Callable[[str], None]) -> None: + DOM_change_callback.remove(callback) + + +async def add_mutation_observer(page:Page): + """ + Adds a mutation observer to the page to detect changes in the DOM. + When changes are detected, the observer calls the dom_mutation_change_detected function in the browser context. + This changes can be detected by subscribing to the dom_mutation_change_detected function by individual skills. + + Current implementation only detects when a new node is added to the DOM. + However, in many cases, the change could be a change in the style or class of an existing node (e.g. toggle visibility of a hidden node). + """ + + await page.evaluate(""" + console.log('Adding a mutation observer for DOM changes'); + new MutationObserver((mutationsList, observer) => { + let changes_detected = []; + for(let mutation of mutationsList) { + if (mutation.type === 'childList') { + let allAddedNodes=mutation.addedNodes; + for(let node of allAddedNodes) { + if(node.tagName && !['SCRIPT', 'NOSCRIPT', 'STYLE'].includes(node.tagName) && !node.closest('#agentDriveAutoOverlay')) { + let visibility=true; + let content = node.innerText.trim(); + if(visibility && node.innerText.trim()){ + if(content) { + changes_detected.push({tag: node.tagName, content: content}); + } + } + } + } + } else if (mutation.type === 'characterData') { + let node = mutation.target; + if(node.parentNode && !['SCRIPT', 'NOSCRIPT', 'STYLE'].includes(node.parentNode.tagName) && !node.parentNode.closest('#agentDriveAutoOverlay')) { + let visibility=true; + let content = node.data.trim(); + if(visibility && content && window.getComputedStyle(node.parentNode).display !== 'none'){ + if(content && !changes_detected.some(change => change.content.includes(content))) { + changes_detected.push({tag: node.parentNode.tagName, content: content}); + } + } + } + } + } + if(changes_detected.length > 0) { + window.dom_mutation_change_detected(JSON.stringify(changes_detected)); + } + }).observe(document, {subtree: true, childList: true, characterData: true}); + """) + + +async def handle_navigation_for_mutation_observer(page:Page): + await add_mutation_observer(page) + +async def dom_mutation_change_detected(changes_detected: str): + """ + Detects changes in the DOM (new nodes added) and emits the event to all subscribed callbacks. + The changes_detected is a string in JSON formatt containing the tag and content of the new nodes added to the DOM. + + e.g. The following will be detected when autocomplete recommendations show up when one types Nelson Mandela on google search + [{'tag': 'SPAN', 'content': 'nelson mandela wikipedia'}, {'tag': 'SPAN', 'content': 'nelson mandela movies'}] + """ + changes_detected = json.loads(changes_detected.replace('\t', '').replace('\n', '')) + if len(changes_detected) > 0: + # Emit the event to all subscribed callbacks + for callback in DOM_change_callback: + # If the callback is a coroutine function + if asyncio.iscoroutinefunction(callback): + await callback(changes_detected) + # If the callback is a regular function + else: + callback(changes_detected) diff --git a/Agent_E/ae/utils/formatting_helper.py b/Agent_E/ae/utils/formatting_helper.py new file mode 100644 index 0000000..9ff2f12 --- /dev/null +++ b/Agent_E/ae/utils/formatting_helper.py @@ -0,0 +1,56 @@ + +import json +import re +from typing import Any + + +def str_to_bool(s: str | bool) -> bool: + """ + Convert a string representation of truth to True or False. + + Parameters: + s (str | bool): The string to convert, or a boolean. + + Returns: + bool: True if the string represents a truth value, False otherwise. + """ + if isinstance(s, bool): + return s + return s.lower() in ['true', '1', 't', 'y', 'yes'] + +def str_to_json(s: str) -> dict[str, Any] | None: + """ + Convert a string representation of a JSON object to a dictionary. + + Parameters: + s (str): The string to convert. + + Returns: + dict[str, Any] | None: The dictionary representation of the JSON object. If the parsing fails, returns None. + """ + s_fixed = re.sub(r'(? bool: + """ + Check if a message is a terminating message. + + Parameters: + message (str): The message to check. + + Returns: + bool: True if the message is a terminating message, False otherwise. + """ + message_as_json = str_to_json(message) + if message_as_json is None: + if message.find('"terminate": "yes"') != -1: + return True + return False + else: + return message_as_json.get("terminate") == "yes" diff --git a/Agent_E/ae/utils/gemini_llm_helper.py b/Agent_E/ae/utils/gemini_llm_helper.py new file mode 100644 index 0000000..1bfece7 --- /dev/null +++ b/Agent_E/ae/utils/gemini_llm_helper.py @@ -0,0 +1,77 @@ +import os +import re +from typing import Any + +import google.generativeai as genai # type: ignore +from dotenv import load_dotenv + +from Agent_E.ae.utils.logger import logger + +GCP_BLOCK_NONE_SAFETY_SETTINGS: list[dict[str, str]] = [ + { + "category": "HARM_CATEGORY_HARASSMENT", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "threshold": "BLOCK_NONE" + }, +] + +# Pre-compile the regular expression pattern for removing json markers from LLM response +llm_json_or_python_begin_response_pattern = re.compile(r"^```(python|json)?\n?") +llm_end_response_pattern = re.compile(r"```$") + +class GeminiLLMHelper: + def __init__(self): + load_dotenv() + genai.configure(api_key=os.environ.get("GEMINI_API_KEY")) # type: ignore + + def process_llm_response(self, response: str): + if response: + # Use the compiled regex to replace the patterns with an empty string + response = llm_json_or_python_begin_response_pattern.sub("", response) + response = llm_end_response_pattern.sub("", response) + return response + + async def get_chat_completion_response_async(self, system_msg:str, user_msgs:list[str], model_name:str="gemini-1.5-pro-latest", temperature:float=0.1, + max_tokens:int=256, top_p:int=1, top_k: int=1, safety_settings:list[dict[str, str]]=GCP_BLOCK_NONE_SAFETY_SETTINGS) -> str|None: + formatted_msgs: list[dict[str, Any]] = [{"role": "user", "parts": [system_msg]}] + user_msgs_parts: list[str] = [] + for user_msg in user_msgs: + user_msgs_parts.append(user_msg) + + formatted_msgs.append({"role": "user", "parts": user_msgs_parts}) + response = None + try: + model = genai.GenerativeModel(model_name) + response = model.generate_content(formatted_msgs, stream=False, # type: ignore + generation_config=genai.types.GenerationConfig( + max_output_tokens=max_tokens, + temperature=temperature, + top_p=top_p, + top_k=top_k), + safety_settings=safety_settings) + return self.process_llm_response(response.text) + except ValueError: + if response: + logger.error(f"Response from GCP Gen AI did not contain text. prompt: {system_msg} and user messages: {user_msgs}. Candidates: {response.candidates}") + else: + logger.error(f"There was no response from GCP Gen AI for prompt: {system_msg} and user messages: {user_msgs}") + return None + +# async def main(): +# from Agent_E.ae.core.prompts import LLM_PROMPTS +# helper = GeminiLLMHelper() +# response = await helper.get_chat_completion_response_async(LLM_PROMPTS["SKILLS_HARVESTING_PROMPT"], ["What is the weather like today?", "And How are you?"], temperature=0, max_tokens=4000) +# print("*******\nResponse: ", response, "\n*******\n") + +# asyncio.run(main()) diff --git a/Agent_E/ae/utils/get_detailed_accessibility_tree.py b/Agent_E/ae/utils/get_detailed_accessibility_tree.py new file mode 100644 index 0000000..7e5a200 --- /dev/null +++ b/Agent_E/ae/utils/get_detailed_accessibility_tree.py @@ -0,0 +1,529 @@ +import json +import os +import re +import traceback +from typing import Annotated +from typing import Any + +from playwright.async_api import Page + +from Agent_E.ae.config import SOURCE_LOG_FOLDER_PATH +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.logger import logger + +space_delimited_mmid = re.compile(r'^[\d ]+$') + +def is_space_delimited_mmid(s: str) -> bool: + """ + Check if the given string matches the the mmid pattern of number space repeated. + + Parameters: + - s (str): The string to check against the pattern. + + Returns: + - bool: True if the string matches the pattern, False otherwise. + """ + # Use fullmatch() to ensure the entire string matches the pattern + return bool(space_delimited_mmid.fullmatch(s)) + + +async def __inject_attributes(page: Page): + """ + Injects 'mmid' and 'aria-keyshortcuts' into all DOM elements. If an element already has an 'aria-keyshortcuts', + it renames it to 'orig-aria-keyshortcuts' before injecting the new 'aria-keyshortcuts' + This will be captured in the accessibility tree and thus make it easier to reconcile the tree with the DOM. + 'aria-keyshortcuts' is choosen because it is not widely used aria attribute. + """ + + last_mmid = await page.evaluate("""() => { + const allElements = document.querySelectorAll('*'); + let id = 0; + allElements.forEach(element => { + const origAriaAttribute = element.getAttribute('aria-keyshortcuts'); + const mmid = `${++id}`; + element.setAttribute('mmid', mmid); + element.setAttribute('aria-keyshortcuts', mmid); + //console.log(`Injected 'mmid'into element with tag: ${element.tagName} and mmid: ${mmid}`); + if (origAriaAttribute) { + element.setAttribute('orig-aria-keyshortcuts', origAriaAttribute); + } + }); + return id; + }""") + logger.debug(f"Added MMID into {last_mmid} elements") + + +async def __fetch_dom_info(page: Page, accessibility_tree: dict[str, Any], only_input_fields: bool): + """ + Iterates over the accessibility tree, fetching additional information from the DOM based on 'mmid', + and constructs a new JSON structure with detailed information. + + Args: + page (Page): The page object representing the web page. + accessibility_tree (dict[str, Any]): The accessibility tree JSON structure. + only_input_fields (bool): Flag indicating whether to include only input fields in the new JSON structure. + + Returns: + dict[str, Any]: The pruned tree with detailed information from the DOM. + """ + + logger.debug("Reconciling the Accessibility Tree with the DOM") + # Define the attributes to fetch for each element + attributes = ['name', 'aria-label', 'placeholder', 'mmid', "id", "for", "data-testid"] + backup_attributes = [] #if the attributes are not found, then try to get these attributes + tags_to_ignore = ['head','style', 'script', 'link', 'meta', 'noscript', 'template', 'iframe', 'g', 'main', 'c-wiz','svg', 'path'] + attributes_to_delete = ["level", "multiline", "haspopup", "id", "for"] + ids_to_ignore = ['agentDriveAutoOverlay'] + + # Recursive function to process each node in the accessibility tree + async def process_node(node: dict[str, Any]): + if 'children' in node: + for child in node['children']: + await process_node(child) + + # Use 'name' attribute from the accessibility node as 'mmid' + mmid_temp: str = node.get('keyshortcuts') # type: ignore + + # If the name has multiple mmids, take the last one + if(mmid_temp and is_space_delimited_mmid(mmid_temp)): + #TODO: consider if we should grab each of the mmids and process them separately as seperate nodes copying this node's attributes + mmid_temp = mmid_temp.split(' ')[-1] + + #focusing on nodes with mmid, which is the attribute we inject + try: + mmid = int(mmid_temp) + except (ValueError, TypeError): + #logger.error(f"'name attribute contains \"{node.get('name')}\", which is not a valid numeric mmid. Adding node as is: {node}") + return node.get('name') + + if node['role'] == 'menuitem': + return node.get('name') + + if node.get('role') == 'dialog' and node.get('modal') == True: # noqa: E712 + node["important information"] = "This is a modal dialog. Please interact with this dialog and close it to be able to interact with the full page (e.g. by pressing the close button or selecting an option)." + + if mmid: + # Determine if we need to fetch 'innerText' based on the absence of 'children' in the accessibility node + should_fetch_inner_text = 'children' not in node + + js_code = """ + (input_params) => { + const should_fetch_inner_text = input_params.should_fetch_inner_text; + const mmid = input_params.mmid; + const attributes = input_params.attributes; + const tags_to_ignore = input_params.tags_to_ignore; + const ids_to_ignore = input_params.ids_to_ignore; + + const element = document.querySelector(`[mmid="${mmid}"]`); + + if (!element) { + console.log(`No element found with mmid: ${mmid}`); + return null; + } + + if (ids_to_ignore.includes(element.id)) { + console.log(`Ignoring element with id: ${element.id}`, element); + return null; + } + //Ignore "option" because it would have been processed with the select element + if (tags_to_ignore.includes(element.tagName.toLowerCase()) || element.tagName.toLowerCase() === "option") return null; + + let attributes_to_values = { + 'tag': element.tagName.toLowerCase() // Always include the tag name + }; + + // If the element is an input, include its type as well + if (element.tagName.toLowerCase() === 'input') { + attributes_to_values['tag_type'] = element.type; // This will capture 'checkbox', 'radio', etc. + } + else if (element.tagName.toLowerCase() === 'select') { + attributes_to_values["mmid"] = element.getAttribute('mmid'); + attributes_to_values["role"] = "combobox"; + attributes_to_values["options"] = []; + + for (const option of element.options) { + let option_attributes_to_values = { + "mmid": option.getAttribute('mmid'), + "text": option.text, + "value": option.value, + "selected": option.selected + }; + attributes_to_values["options"].push(option_attributes_to_values); + } + return attributes_to_values; + } + + for (const attribute of attributes) { + let value = element.getAttribute(attribute); + + if(value){ + /* + if(attribute === 'href'){ + value = value.split('?')[0] + } + */ + attributes_to_values[attribute] = value; + } + } + + if (should_fetch_inner_text && element.innerText) { + attributes_to_values['description'] = element.innerText; + } + + let role = element.getAttribute('role'); + if(role==='listbox' || element.tagName.toLowerCase()=== 'ul'){ + let children=element.children; + let filtered_children = Array.from(children).filter(child => child.getAttribute('role') === 'option'); + console.log("Listbox or ul found: ", filtered_children); + let attributes_to_include = ['mmid', 'role', 'aria-label','value']; + attributes_to_values["additional_info"]=[] + for (const child of children) { + let children_attributes_to_values = {}; + + for (let attr of child.attributes) { + // If the attribute is not in the predefined list, add it to children_attributes_to_values + if (attributes_to_include.includes(attr.name)) { + children_attributes_to_values[attr.name] = attr.value; + } + } + + attributes_to_values["additional_info"].push(children_attributes_to_values); + } + } + // Check if attributes_to_values contains more than just 'name', 'role', and 'mmid' + const keys = Object.keys(attributes_to_values); + const minimalKeys = ['tag', 'mmid']; + const hasMoreThanMinimalKeys = keys.length > minimalKeys.length || keys.some(key => !minimalKeys.includes(key)); + + if (!hasMoreThanMinimalKeys) { + //If there were no attributes found, then try to get the backup attributes + for (const backupAttribute of input_params.backup_attributes) { + let value = element.getAttribute(backupAttribute); + if(value){ + attributes_to_values[backupAttribute] = value; + } + } + + //if even the backup attributes are not found, then return null, which will cause this element to be skipped + if(Object.keys(attributes_to_values).length <= minimalKeys.length) { + if (element.tagName.toLowerCase() === 'button') { + attributes_to_values["mmid"] = element.getAttribute('mmid'); + attributes_to_values["role"] = "button"; + attributes_to_values["additional_info"] = []; + let children=element.children; + let attributes_to_exclude = ['width', 'height', 'path', 'class', 'viewBox', 'mmid'] + + // Check if the button has no text and no attributes + if (element.innerText.trim() === '') { + + for (const child of children) { + let children_attributes_to_values = {}; + + for (let attr of child.attributes) { + // If the attribute is not in the predefined list, add it to children_attributes_to_values + if (!attributes_to_exclude.includes(attr.name)) { + children_attributes_to_values[attr.name] = attr.value; + } + } + + attributes_to_values["additional_info"].push(children_attributes_to_values); + } + console.log("Button with no text and no attributes: ", attributes_to_values); + return attributes_to_values; + } + } + + return null; // Return null if only minimal keys are present + } + } + return attributes_to_values; + } + """ + + # Fetch attributes and possibly 'innerText' from the DOM element by 'mmid' + element_attributes = await page.evaluate(js_code, + {"mmid": mmid, "attributes": attributes, "backup_attributes": backup_attributes, + "should_fetch_inner_text": should_fetch_inner_text, + "tags_to_ignore": tags_to_ignore, + "ids_to_ignore": ids_to_ignore}) + + if 'keyshortcuts' in node: + del node['keyshortcuts'] #remove keyshortcuts since it is not needed + + node["mmid"]=mmid + + # Update the node with fetched information + if element_attributes: + node.update(element_attributes) + + # check if 'name' and 'mmid' are the same + if node.get('name') == node.get('mmid') and node.get('role') != "textbox": + del node['name'] # Remove 'name' from the node + + if 'name' in node and 'description' in node and (node['name'] == node['description'] or node['name'] == node['description'].replace('\n', ' ') or node['description'].replace('\n', '') in node['name']): + del node['description'] #if the name is same as description, then remove the description to avoid duplication + + if 'name' in node and 'aria-label' in node and node['aria-label'] in node['name']: + del node['aria-label'] #if the name is same as the aria-label, then remove the aria-label to avoid duplication + + if 'name' in node and 'text' in node and node['name'] == node['text']: + del node['text'] #if the name is same as the text, then remove the text to avoid duplication + + if node.get('tag') == "select": #children are not needed for select menus since "options" attriburte is already added + node.pop("children", None) + node.pop("role", None) + node.pop("description", None) + + #role and tag can have the same info. Get rid of role if it is the same as tag + if node.get('role') == node.get('tag'): + del node['role'] + + # avoid duplicate aria-label + if node.get("aria-label") and node.get("placeholder") and node.get("aria-label") == node.get("placeholder"): + del node["aria-label"] + + if node.get("role") == "link": + del node["role"] + if node.get("description"): + node["text"] = node["description"] + del node["description"] + + #textbox just means a text input and that is expressed well enough with the rest of the attributes returned + #if node.get('role') == "textbox": + # del node['role'] + + if node.get('role') == "textbox": + #get the id attribute of this field from the DOM + if "id" in element_attributes and element_attributes["id"]: + #find if there is an element in the DOM that has this id in aria-labelledby. + js_code = """ + (inputParams) => { + let referencingElements = []; + const referencedElement = document.querySelector(`[aria-labelledby="${inputParams.aria_labelled_by_query_value}"]`); + if(referencedElement) { + const mmid = referencedElement.getAttribute('mmid'); + if (mmid) { + return {"mmid": mmid, "tag": referencedElement.tagName.toLowerCase()}; + } + } + return null; + } + """ + #textbox just means a text input and that is expressed well enough with the rest of the attributes returned + #del node['role'] + + #remove attributes that are not needed once processing of a node is complete + for attribute_to_delete in attributes_to_delete: + if attribute_to_delete in node: + node.pop(attribute_to_delete, None) + else: + logger.debug(f"No element found with mmid: {mmid}, deleting node: {node}") + node["marked_for_deletion_by_mm"] = True + + + # Process each node in the tree starting from the root + await process_node(accessibility_tree) + + pruned_tree = __prune_tree(accessibility_tree, only_input_fields) + + logger.debug("Reconciliation complete") + return pruned_tree + + +async def __cleanup_dom(page: Page): + """ + Cleans up the DOM by removing injected 'aria-description' attributes and restoring any original 'aria-keyshortcuts' + from 'orig-aria-keyshortcuts'. + """ + logger.debug("Cleaning up the DOM's previous injections") + await page.evaluate("""() => { + const allElements = document.querySelectorAll('*[mmid]'); + allElements.forEach(element => { + element.removeAttribute('aria-keyshortcuts'); + const origAriaLabel = element.getAttribute('orig-aria-keyshortcuts'); + if (origAriaLabel) { + element.setAttribute('aria-keyshortcuts', origAriaLabel); + element.removeAttribute('orig-aria-keyshortcuts'); + } + }); + }""") + logger.debug("DOM cleanup complete") + + +def __prune_tree(node: dict[str, Any], only_input_fields: bool) -> dict[str, Any] | None: + """ + Recursively prunes a tree starting from `node`, based on pruning conditions and handling of 'unraveling'. + + The function has two main jobs: + 1. Pruning: Remove nodes that don't meet certain conditions, like being marked for deletion. + 2. Unraveling: For nodes marked with 'marked_for_unravel_children', we replace them with their children, + effectively removing the node and lifting its children up a level in the tree. + + This happens in place, meaning we modify the tree as we go, which is efficient but means you should + be cautious about modifying the tree outside this function during a prune operation. + + Args: + - node (Dict[str, Any]): The node we're currently looking at. We'll check this node, its children, + and so on, recursively down the tree. + - only_input_fields (bool): If True, we're only interested in pruning input-related nodes (like form fields). + This lets you narrow the focus if, for example, you're only interested in cleaning up form-related parts + of a larger tree. + + Returns: + - dict[str, Any] | None: The pruned version of `node`, or None if `node` was pruned away. When we 'unravel' + a node, we directly replace it with its children in the parent's list of children, so the return value + will be the parent, updated in place. + + Notes: + - 'marked_for_deletion_by_mm' is our flag for nodes that should definitely be removed. + - Unraveling is neat for flattening the tree when a node is just a wrapper without semantic meaning. + - We use a while loop with manual index management to safely modify the list of children as we iterate over it. + """ + if "marked_for_deletion_by_mm" in node: + return None + + if 'children' in node: + i = 0 + while i < len(node['children']): + child = node['children'][i] + if 'marked_for_unravel_children' in child: + # Replace the current child with its children + if 'children' in child: + node['children'] = node['children'][:i] + child['children'] + node['children'][i+1:] + i += len(child['children']) - 1 # Adjust the index for the new children + else: + # If the node marked for unraveling has no children, remove it + node['children'].pop(i) + i -= 1 # Adjust the index since we removed an element + else: + # Recursively prune the child if it's not marked for unraveling + pruned_child = __prune_tree(child, only_input_fields) + if pruned_child is None: + # If the child is pruned, remove it from the children list + node['children'].pop(i) + i -= 1 # Adjust the index since we removed an element + else: + # Update the child with the pruned version + node['children'][i] = pruned_child + i += 1 # Move to the next child + + # After processing all children, if the children array is empty, remove it + if not node['children']: + del node['children'] + + # Apply existing conditions to decide if the current node should be pruned + return None if __should_prune_node(node, only_input_fields) else node + + +def __should_prune_node(node: dict[str, Any], only_input_fields: bool): + """ + Determines if a node should be pruned based on its 'role' and 'element_attributes'. + + Args: + node (dict[str, Any]): The node to be evaluated. + only_input_fields (bool): Flag indicating whether only input fields should be considered. + + Returns: + bool: True if the node should be pruned, False otherwise. + """ + #If the request is for only input fields and this is not an input field, then mark the node for prunning + if node.get("role") != "WebArea" and only_input_fields and not (node.get("tag") in ("input", "button", "textarea") or node.get("role") == "button"): + return True + + if node.get('role') == 'generic' and 'children' not in node and not ('name' in node and node.get('name')): # The presence of 'children' is checked after potentially deleting it above + return True + + if node.get('role') in ['separator', 'LineBreak']: + return True + processed_name = "" + if 'name' in node: + processed_name:str =node.get('name') # type: ignore + processed_name = processed_name.replace(',', '') + processed_name = processed_name.replace(':', '') + processed_name = processed_name.replace('\n', '') + processed_name = processed_name.strip() + if len(processed_name) <3: + processed_name = "" + + #check if the node only have name and role, then delete that node + if len(node) == 2 and 'name' in node and 'role' in node and not (node.get('role') == "text" and processed_name != ""): + return True + return False + +async def get_node_dom_element(page: Page, mmid: str): + return await page.evaluate(""" + (mmid) => { + return document.querySelector(`[mmid="${mmid}"]`); + } + """, mmid) + + +async def get_element_attributes(page: Page, mmid: str, attributes: list[str]): + return await page.evaluate(""" + (inputParams) => { + const mmid = inputParams.mmid; + const attributes = inputParams.attributes; + const element = document.querySelector(`[mmid="${mmid}"]`); + if (!element) return null; // Return null if element is not found + + let attrs = {}; + for (let attr of attributes) { + attrs[attr] = element.getAttribute(attr); + } + return attrs; + } + """, {"mmid": mmid, "attributes": attributes}) + + +async def get_dom_with_accessibility_info() -> Annotated[dict[str, Any] | None, "A minified representation of the HTML DOM for the current webpage"]: + """ + Retrieves, processes, and minifies the Accessibility tree of the active page in a browser instance. + Strictly follow the name and role tag for any interaction with the nodes. + + Returns: + - The minified JSON content of the browser's active page. + """ + logger.debug("Executing Get Accessibility Tree Command") + # Create and use the PlaywrightManager + browser_manager = PlaywrightManager(browser_type='chromium', headless=False) + page = await browser_manager.get_current_page() + if page is None: # type: ignore + raise ValueError('No active page found') + + return await do_get_accessibility_info(page) + + +async def do_get_accessibility_info(page: Page, only_input_fields: bool = False): + """ + Retrieves the accessibility information of a web page and saves it as JSON files. + + Args: + page (Page): The page object representing the web page. + only_input_fields (bool, optional): If True, only retrieves accessibility information for input fields. + Defaults to False. + + Returns: + dict[str, Any] or None: The enhanced accessibility tree as a dictionary, or None if an error occurred. + """ + await __inject_attributes(page) + accessibility_tree: dict[str, Any] = await page.accessibility.snapshot(interesting_only=True) # type: ignore + + with open(os.path.join(SOURCE_LOG_FOLDER_PATH, 'json_accessibility_dom.json'), 'w', encoding='utf-8') as f: + f.write(json.dumps(accessibility_tree, indent=2)) + logger.debug("json_accessibility_dom.json saved") + + await __cleanup_dom(page) + try: + enhanced_tree = await __fetch_dom_info(page, accessibility_tree, only_input_fields) + + logger.debug("Enhanced Accessibility Tree ready") + + with open(os.path.join(SOURCE_LOG_FOLDER_PATH, 'json_accessibility_dom_enriched.json'), 'w', encoding='utf-8') as f: + f.write(json.dumps(enhanced_tree, indent=2)) + logger.debug("json_accessibility_dom_enriched.json saved") + + return enhanced_tree + except Exception as e: + logger.error(f"Error while fetching DOM info: {e}") + traceback.print_exc() + return None diff --git a/Agent_E/ae/utils/http_helper.py b/Agent_E/ae/utils/http_helper.py new file mode 100644 index 0000000..3520b68 --- /dev/null +++ b/Agent_E/ae/utils/http_helper.py @@ -0,0 +1,43 @@ +from typing import Any + +import requests + + +def make_post_request(url: str, data: dict[str, Any], api_key: str, api_key_header_name: str = "apikey") -> dict[str, Any]|None: + """ + Makes a POST request to the specified URL with a JSON body and an API key header. + + Args: + url (str): The URL to send the POST request to. + data (Dict[str, Any]): The JSON data to include in the POST request body. + api_key (str): The API key to include in the request headers. + api_key_header_name (str): The name of the header to include the API key in. Defaults to "apikey". + + Returns: + Optional[Dict[str, Any]]: The JSON response from the server if the request was successful and the response is in JSON format. + None: If the request failed or the response is not in JSON format. + + Raises: + requests.exceptions.RequestException: If an error occurs during the HTTP request. + """ + # Define the headers for the request + headers = { + 'Content-Type': 'application/json', + api_key_header_name: api_key + } + + try: + # Make the POST request with the given URL, data, and headers + response = requests.post(url, json=data, headers=headers) + + # Check if the request was successful + response.raise_for_status() + + # Attempt to return the JSON response + return response.json() + except requests.exceptions.RequestException as e: + print(f"Error: {e}") + return None + except ValueError: + print("Error: Response is not in JSON format") + return None diff --git a/Agent_E/ae/utils/js_helper.py b/Agent_E/ae/utils/js_helper.py new file mode 100644 index 0000000..0df6885 --- /dev/null +++ b/Agent_E/ae/utils/js_helper.py @@ -0,0 +1,34 @@ +import json +import re + +from Agent_E.ae.utils.logger import logger + + +def escape_js_message(message: str) -> str: + """ + Escape a message for use in JavaScript code. + + Args: + message (str): The message to escape. + + Returns: + str: The escaped message. + """ + return json.dumps(message) + + +def beautify_plan_message(message:str) -> str: + """ + Add a newline between each numbered step in the plan message if it does not already exist. + + Args: + message (str): The plan message. + + Returns: + str: The plan message with newlines added between each numbered step. + """ + logger.debug(f"beautify_plan_message original:\n{message}") + # Add a newline before each numbered step that is not already preceded by a newline + plan_with_newlines = re.sub(r'(? None: + log_format = os.getenv("LOG_MESSAGES_FORMAT", "text").lower() + + # Set log level for the main logger + logger.setLevel(level.upper()) + + # Create a handler for logging + handler = logging.StreamHandler() + + if log_format == "json": + # JSON format + formatter = jsonlogger.JsonFormatter( + fmt='%(asctime)s %(name)s %(levelname)s %(message)s %(filename)s %(lineno)d', + datefmt='%Y-%m-%d %H:%M:%S' + ) + else: + # Text format + formatter = logging.Formatter( + fmt='[%(asctime)s] %(levelname)s {%(filename)s:%(lineno)d} - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + + handler.setFormatter(formatter) + logger.handlers = [] # Clear existing handlers + logger.addHandler(handler) + + # Ensure other loggers have the same handler + http_loggers = ["openai", "autogen"] + for http_logger in http_loggers: + lib_logger = logging.getLogger(http_logger) + lib_logger.setLevel(logging.DEBUG) + lib_logger.handlers = [] # Clear any existing handlers + lib_logger.addHandler(handler) # Add the same handler + + +# Call the configure logger function to set up the logger initially +configure_logger(level="INFO") + +# Function to set log level +def set_log_level(level: str) -> None: + """ + Set the log level for the logger. + + Parameters: + - level (str): A logging level such as 'debug', 'info', 'warning', 'error', or 'critical'. + """ + configure_logger(level) + +# Set default log levels for other libraries +# logging.getLogger("httpcore").setLevel(logging.DEBUG) +# logging.getLogger("httpx").setLevel(logging.DEBUG) +# logging.getLogger("openai").setLevel(logging.DEBUG) +# logging.getLogger("autogen").setLevel(logging.DEBUG) +logging.getLogger("matplotlib.pyplot").setLevel(logging.WARNING) +logging.getLogger("PIL.PngImagePlugin").setLevel(logging.WARNING) +logging.getLogger("PIL.Image").setLevel(logging.WARNING) + +# Re-export the logger for ease of use +__all__ = ["logger", "set_log_level"] diff --git a/Agent_E/ae/utils/openai_llm_helper.py b/Agent_E/ae/utils/openai_llm_helper.py new file mode 100644 index 0000000..e863453 --- /dev/null +++ b/Agent_E/ae/utils/openai_llm_helper.py @@ -0,0 +1,51 @@ +import os +from typing import Any + +import openai +from dotenv import load_dotenv +from openai import AsyncOpenAI + + +class OpenAILLMHelper: + def __init__(self): + load_dotenv() + self.client = AsyncOpenAI(api_key=os.environ.get("OPENAI_API_KEY")) + + async def get_chat_completion_response_async(self, system_msg:str, user_msgs:list[str], model_name:str="gpt-4-turbo-preview", temperature:float=0.1, max_tokens:int=256, frequency_penalty:float=0.0, top_p: float=1.0, top_k: int=1, presence_penalty: float=0.0): + formatted_msgs: list[dict[str, Any]] = [{"role": "system", "content": system_msg}] + + for user_msg in user_msgs: + formatted_msgs.append({"role": "user", "content": user_msg}) + + try: + response = await self.client.chat.completions.create( + model=model_name, + max_tokens=max_tokens, + temperature=temperature, + frequency_penalty=frequency_penalty, + top_p=top_p, + presence_penalty=presence_penalty, + messages=formatted_msgs # type: ignore + ) + print(">>> openai response:", response) + if response.choices and len(response.choices) > 0 and response.choices[0].message and response.choices[0].message.content: + return response.choices[0].message.content + return None + except openai.APIConnectionError as e: + print("The server could not be reached") + print(e.__cause__) # an underlying Exception, likely raised within httpx. + raise Exception(f"Calling {model_name} LLM failed. The server could not be reached.") from e + except openai.RateLimitError as e: + print("A 429 status code was received; we should back off a bit.") + raise Exception(f"Calling {model_name} LLM failed. Rate limit error.") from e + except openai.APIStatusError as e: + print(e.status_code) + print(e.response) + raise Exception(f"Calling {model_name} LLM failed. Error: {e}") from e + +# async def main(): +# helper = OpenAILLMHelper() +# response = await helper.get_chat_completion_response_async(LLM_PROMPTS["SKILLS_HARVESTING_PROMPT"], ["What is the weather like today?"], temperature=0, max_tokens=4000) +# print("*******\nResponse: ", response, "\n*******\n") + +# asyncio.run(main()) diff --git a/Agent_E/ae/utils/response_parser.py b/Agent_E/ae/utils/response_parser.py new file mode 100644 index 0000000..982227d --- /dev/null +++ b/Agent_E/ae/utils/response_parser.py @@ -0,0 +1,60 @@ +import json +from typing import Any + +from Agent_E.ae.utils.logger import logger + + +def parse_response(message: str) -> dict[str, Any]: + """ + Parse the response from the browser agent and return the response as a dictionary. + """ + # Parse the response content + json_response = {} + #if message starts with ``` and ends with ``` then remove them + if message.startswith("```"): + message = message[3:] + if message.endswith("```"): + message = message[:-3] + if message.startswith("json"): + message = message[4:] + + message = message.strip() + try: + json_response: dict[str, Any] = json.loads(message) + except Exception as e: + # If the response is not a valid JSON, try pass it using string matching. + #This should seldom be triggered + logger.warn(f"LLM response was not properly formed JSON. Will try to use it as is. LLM response: \"{message}\". Error: {e}") + message = message.replace("\\n", "\n") + message = message.replace("\n", " ") # type: ignore + if ("plan" in message and "next_step" in message): + start = message.index("plan") + len("plan") + end = message.index("next_step") + json_response["plan"] = message[start:end].replace('"', '').strip() + if ("next_step" in message and "terminate" in message): + start = message.index("next_step") + len("next_step") + end = message.index("terminate") + json_response["next_step"] = message[start:end].replace('"', '').strip() + if ("terminate" in message and "final_response" in message): + start = message.index("terminate") + len("terminate") + end = message.index("final_response") + matched_string=message[start:end].replace('"', '').strip() + if ("yes" in matched_string): + json_response["terminate"] = "yes" + else: + json_response["terminate"] = "no" + + start=message.index("final_response") + len("final_response") + end=len(message)-1 + json_response["final_response"] = message[start:end].replace('"', '').strip() + + elif ("terminate" in message): + start = message.index("terminate") + len("terminate") + end = len(message)-1 + matched_string=message[start:end].replace('"', '').strip() + if ("yes" in matched_string): + json_response["terminate"] = "yes" + else: + json_response["terminate"] = "no" + + return json_response diff --git a/Agent_E/ae/utils/ui_messagetype.py b/Agent_E/ae/utils/ui_messagetype.py new file mode 100644 index 0000000..2eac400 --- /dev/null +++ b/Agent_E/ae/utils/ui_messagetype.py @@ -0,0 +1,14 @@ +from enum import Enum + + +class MessageType(Enum): + PLAN = "plan" + STEP = "step" + ACTION ="action" + ANSWER = "answer" + QUESTION = "question" + INFO = "info" + FINAL = "final" + DONE = "transaction_done" + ERROR = "error" + MAX_TURNS_REACHED = "max_turns_reached" diff --git a/Agent_E/test/evaluators.py b/Agent_E/test/evaluators.py new file mode 100644 index 0000000..f8f94aa --- /dev/null +++ b/Agent_E/test/evaluators.py @@ -0,0 +1,437 @@ +"""base class for evaluation""" +import collections +import html +import time +import urllib +import urllib.parse +from Agent_E.test.test_utils import clean_answer +from Agent_E.test.test_utils import evaluate_exact_match +from Agent_E.test.test_utils import evaluate_fuzzy_match +from Agent_E.test.test_utils import evaluate_must_include +from Agent_E.test.test_utils import evaluate_ua_match +from typing import Any + +from Agent_E.ae.utils.logger import logger +from playwright.sync_api import CDPSession +from playwright.sync_api import Page +from termcolor import colored + + +class Evaluator: + """Base class for evaluation strategies. + + Attributes: + eval_tag (str): A tag to identify or categorize the evaluator. + """ + + def __init__(self, eval_tag: str = "") -> None: + """Initialize the evaluator with an optional evaluation tag.""" + self.eval_tag = eval_tag + + async def __call__(self, task_config: dict[str, Any], page: Page, client: CDPSession, answer: str) -> dict[str, float|str]: + """Abstract method to be implemented by subclasses for evaluation. + + Raises: + NotImplementedError: This method should be overridden by subclasses. + """ + raise NotImplementedError("This method should be overridden by subclasses.") + + +class StringEvaluator(Evaluator): + """Evaluates string-based answers using various matching criteria. + + Supports exact matches, some matches, fuzzy matching using LLM, and unachievable task matching. + """ + + async def __call__( + self, + task_config: dict[str, Any], + page: Page | None = None, + client: CDPSession | None = None, + answer: str | None = None, + + ) -> dict[str, float|str]: + last_action = answer or "" + pred = clean_answer(last_action) + + score = 1.0 + for approach, value in task_config["eval"]["reference_answers"].items(): + + match approach: + case "exact_match": + logger.info(f"Evaluating exact_match for answer: Predicted: {pred} , Reference: {value}") + score *= evaluate_exact_match(ref=value, pred=pred) + + case "must_include": + logger.info(f"Evaluating must_include for answer: \"{answer}\" to see if it includes the expeced values: \"{value}\"\n") + assert isinstance(value, list) + for must_value in value: # type: ignore + score *= evaluate_must_include( + ref=must_value, # type: ignore + pred=pred, + tokenize=(len(value) == 1), # type: ignore + ) + case "some_matches": + min_required_matches = value.get("min_required", 1) + matches = sum(evaluate_must_include(ref=phrase, pred=pred, tokenize=False) for phrase in value["phrases"]) + score *= float(matches >= min_required_matches) + case "fuzzy_match": + logger.info(f"Evaluating fuzzy_match for answer: {answer}") + intent = task_config["intent"] + if value == "N/A": + # if the instruction only asks the model to generate N/A when encountering an unachievable task + # without more concrete reasons + score *= evaluate_exact_match(ref=value, pred=pred) + # if the instruction also asks the model to generate the reason why the task is unachievable + # this should be the default as it will prevent false positive N/A` + if score != 1: + score = 1.0 * evaluate_ua_match( + intent=task_config["intent"], + ref=task_config["eval"]["string_note"], + pred=pred, + ) + else: + logger.info(f"Evaluating generic for answer: {answer}") + assert isinstance(value, list) + for reference in value: # type: ignore + score *= evaluate_fuzzy_match( + ref=reference, pred=pred, intent=intent # type: ignore + ) + case _: + logger.info(f"Unknown approach value received: {approach}") + return {"score": score} + + +class URLEvaluator(Evaluator): + """Evaluates if the given URL matches the expected URL criteria defined in the configuration. + + This includes checking if the base path of the URL and its query parameters match those specified in the reference URLs. + """ + + async def __call__( + self, + task_config: dict[str, Any], + page: Page, + client: CDPSession | None = None, + answer: str | None = None + ) -> dict[str, float|str]: + """Evaluates the current page URL against reference URLs specified in the config file. + + Parameters: + task_config (dict[str, Any]): The task configuration containing evaluation criteria. + page (Page): The Playwright page object for the current webpage. + client (CDPSession | None, optional): The Chrome DevTools Protocol session object. Not used in this evaluator. + answer (str | None, optional): Not used in this evaluator. + + Returns: + dict[str, float|str]: "score" 1.0 if the page URL matches any of the reference URLs, considering the matching rule; otherwise 0.0. + + Raises: + ValueError: If an unknown matching rule is specified in the config file. + """ + + def clean_url(url: str) -> str: + url = str(url) + url = url.rstrip("/") + url = url.lower() + return url + + def parse_url(url: str) -> tuple[str, dict[str, list[str]]]: + """Parse a URL into its base, path, and query components.""" + parsed_url = urllib.parse.urlparse(url) + base_path = parsed_url.netloc + parsed_url.path + query = urllib.parse.parse_qs(parsed_url.query) + return base_path, query + + def parse_urls( + urls: list[str], + ) -> tuple[list[str], dict[str, set[str]]]: + """Parse a list of URLs.""" + base_paths: list[str] = [] + queries: dict[str, set[str]] = collections.defaultdict(set) + for url in urls: + base_path, query = parse_url(url) + base_paths.append(base_path) + for k, v in query.items(): + queries[k].update(v) + return base_paths, queries + + pred = clean_url(page.url) + ref_urls = task_config["eval"]["reference_url"].split(" |OR| ") + ref_urls = [clean_url(url) for url in ref_urls] + matching_rule = task_config["eval"].get("url_note", "GOLD in PRED") + if matching_rule == "GOLD in PRED": + for ref_url in ref_urls: + ref_base_path, ref_query = parse_url(ref_url) + pred_base_paths, pred_query = parse_url(pred) + # Calculate base score for each ref_url + base_score = float(ref_base_path in pred_base_paths) + # Calculate query score for each ref_url + query_score = 1.0 + for k, possible_values in ref_query.items(): # type: ignore + if k in pred_query: + query_score *= float( + any( + possible_ref_value in pred_query.get(k, []) # type: ignore + for possible_ref_value in possible_values # type: ignore + ) + ) + else: + # If the key is not in pred_query, check if the reference URL has no query parameters + if not possible_values: + query_score *= 1.0 # No query parameters to match, so consider it a match + else: + query_score *= 0.0 # Reference URL has query parameters but predicted URL does not + # Calculate final score for each ref_url + score = base_score * query_score + # Return immediately if any score is 1 + if score == 1.0: + return {"score": score} + + else: + raise ValueError(f"Unknown matching rule: {matching_rule}") + + return {"score": 0.0} + + +class HTMLContentEvaluator(Evaluator): + """Evaluates if specified HTML content or elements appear on the webpage. + + This involves navigating to URLs specified in the configuration and checking for the presence of HTML elements or content using various strategies. + """ + + async def __call__( + self, + task_config: dict[str, Any], + page: Page, + client: CDPSession | None = None, + answer: str | None = None + ) -> dict[str, float|str]: + """Evaluates the presence of specified HTML content on the webpage. + + Parameters: + task_config (dict[str, Any]): The task configuration containing evaluation criteria. + page (Page): The Playwright page object for the current webpage. + client (CDPSession | None, optional): The Chrome DevTools Protocol session object. Not used in this evaluator. + answer (str | None, optional): Not used in this evaluator. + + Returns: + dict[str, float|str]: "score" A score between 0.0 and 1.0 representing the presence of required HTML content on the webpage. + + Raises: + ValueError: If an unknown locator strategy is specified in the config file. + """ + targets = task_config["eval"]["program_html"] + + score = 1.0 + for target in targets: + target_url: str = target["url"] # which url to check + if target_url.startswith("func"): + func = target_url.split("func:")[1] + func = func.replace("__last_url__", page.url) + target_url = eval(func) + + locator: str = target["locator"] # js element locator + + # navigate to that url + if target_url != "last": + page.goto(target_url) + time.sleep(3) + + # empty, use the full page + if not locator.strip(): + selected_element = page.content() + # use JS to select the element + elif locator.startswith("document.") or locator.startswith("[...document.") or locator.startswith("jsblock:"): + if "prep_actions" in target: + try: + for prep_action in target["prep_actions"]: + page.evaluate(f"() => {prep_action}") + except Exception: + pass + try: + if locator.startswith("jsblock:"): + locator = locator.split("jsblock:")[1] + + selected_element = str(await page.evaluate(f"() => {locator}")) + if not selected_element: + selected_element = "" + except Exception: + # the page is wrong, return empty + selected_element = "" + # run program to call API + elif locator.startswith("func:"): # a helper function + func = locator.split("func:")[1] + func = func.replace("__page__", "page") + selected_element = eval(func) + else: + raise ValueError(f"Unknown locator: {locator}") + + selected_element = html.unescape(selected_element) + + if "exact_match" in target["required_contents"]: + required_contents = target["required_contents"]["exact_match"] + cur_score = evaluate_exact_match( + ref=required_contents, pred=selected_element + ) + score *= float(cur_score) + # logger.info(f"[exact match] {cur_score}, selected element: {selected_element}, required contents: {required_contents}") + elif "must_include" in target["required_contents"]: + required_contents = target["required_contents"]["must_include"] + assert isinstance(required_contents, list) + for content in required_contents: # type: ignore + content_or = content.split(" |OR| ") # type: ignore + cur_score = any( + [ + evaluate_must_include( + ref=content, # type: ignore + pred=selected_element, + tokenize=False, + ) + for content in content_or # type: ignore + ] + ) + score *= float(cur_score) + # logger.info(f"[must include] {cur_score}, selected element: {selected_element}, required contents: {content_or}") + else: + raise ValueError( + f"Unknown required_contents: {target['required_contents'].keys()}" + ) + return {"score": score} + +class ManualContentEvaluator(Evaluator): + """Evaluation Route for Manual Evaluation.""" + async def __call__( + self, + task_config: dict[str, Any], + page: Page, + client: CDPSession | None = None, + answer: str | None = None + ) -> dict[str, float|str]: + """Pauses Execution to get manual evaluation score from user. + + Parameters: + task_config (dict[str, Any]): The task configuration containing evaluation criteria. + page (Page): The Playwright page object for the current webpage. + client (CDPSession | None, optional): The Chrome DevTools Protocol session object. Not used in this evaluator. + answer (str | None, optional): Not used in this evaluator. + + Returns: + dict[str, float|str]: A score representig the status 1 = pass, 0 = fail and -0.1 is a skip. Additionaly, a reason can be provided for the score (mainly for fail/skip). + """ + task = task_config["intent"] + reference_answer = task_config["eval"]["reference_answers"]["manual_check"]["answer"] + answer_type = task_config["eval"]["reference_answers"]["manual_check"]["type"] + id = str(task_config["task_id"]) + index = str(task_config["task_index"]) + + print(colored("\n\n***************************\n", "green", attrs=["bold"])) + print(colored("Task ID: ", "blue", attrs=["bold"]) + id + "\n") + print(colored("Task Index: ", "blue", attrs=["bold"]) + index + "\n") + print(colored("Task: ", "blue", attrs=["bold"]) + task + "\n") + print(colored("Agent answer: ", "blue", attrs=["bold"]) + str(answer or "") + "\n") + + if answer_type.strip().lower() == "possible": + print(colored("Possible answer (reference): ", "yellow") + f"~~~{reference_answer}~~~") + elif answer_type.strip().lower() == "golden": + print(colored("Golden answer (reference): ", "yellow") + reference_answer) + + user_response = input(colored("Annotate the task as Pass, Fail or Skip (please use Skip sparingly)? ", "magenta", attrs=["bold"])) + eval_response: dict[str, float|str] = {} + if(user_response.lower()=="pass"): + eval_response["score"] = 1.0 + elif user_response.lower()=="fail": + eval_response["score"] = 0.0 + elif user_response.lower()=="skip": + eval_response["score"] = -0.1 + else: + print(colored(f"Received response: {user_response}", "red")) + raise ValueError("Invalid user response. Please enter 'Pass', 'Fail' or 'Skip'.") + reason: str|None = None + + if eval_response["score"] <= 0: + reason = input("Reason for rating: ") + eval_response["reason"] = reason + + return eval_response + +class EvaluatorComb(Evaluator): + """Combines multiple evaluators to perform a comprehensive evaluation based on different criteria. + + Attributes: + evaluators (list[Evaluator]): A list of evaluator instances to be used for evaluation. + """ + + def __init__(self, evaluators: list[Evaluator]) -> None: + """Initializes the composite evaluator with a list of individual evaluators. + + Parameters: + evaluators (list[Evaluator]): The list of evaluators to include in the composite evaluation. + """ + self.evaluators = evaluators + + + async def __call__( + self, + task_config: dict[str, Any], + page: Page, + client: CDPSession, + answer: str, + ) -> dict[str, float|str]: + """Performs the evaluation using all included evaluators and aggregates their scores. + + Parameters: + task_config (dict[str, Any]): The task configuration containing evaluation criteria. + page (Page): The Playwright page object for the current webpage. + client (CDPSession): The Chrome DevTools Protocol session object. + answer (str): The answer or content to be evaluated. + + Returns: + dict[str, float|str]: "score" - The aggregated score from all evaluators, representing the overall evaluation result. "reason" - The reason for the evaluation score, if applicable. + """ + score: float = 1.0 + reason: str | None = None + for evaluator in self.evaluators: + eval_result = await evaluator(task_config, page, client, answer) + score: float = score * eval_result["score"] # type: ignore + if "reason" in eval_result: + if reason is None: + reason = eval_result["reason"] # type: ignore + else: + reason += f"\n{eval_result['reason']}" + return {"score": score, "reason": reason} # type: ignore + + +def evaluator_router(task_config: dict[str, Any]) -> EvaluatorComb: + """Creates and configures a composite evaluator based on the evaluation types specified in the configuration file. + + Parameters: + task_config dict[str, Any]: configuration specifying the evaluation types to use. + + Returns: + EvaluatorComb: A composite evaluator configured with the specified types of individual evaluators. + + Raises: + ValueError: If an unsupported evaluation type is specified in the configuration file. + """ + + eval_types = task_config["eval"]["eval_types"] + evaluators: list[Evaluator] = [] + for eval_type in eval_types: + match eval_type: + case "string_match": + logger.info("Adding string evaluator") + evaluators.append(StringEvaluator()) + case "url_match": + logger.info("Adding URL evaluator") + evaluators.append(URLEvaluator()) + case "program_html": + logger.info("Adding HTML evaluator") + evaluators.append(HTMLContentEvaluator()) + case "manual": + logger.info("Adding manual evaluator") + evaluators.append(ManualContentEvaluator()) + case _: + raise ValueError(f"eval_type {eval_type} is not supported") + + return EvaluatorComb(evaluators) diff --git a/Agent_E/test/test_utils.py b/Agent_E/test/test_utils.py new file mode 100644 index 0000000..6ef6def --- /dev/null +++ b/Agent_E/test/test_utils.py @@ -0,0 +1,263 @@ +"""Implements helper functions to assist evaluation cases where other evaluators are not suitable.""" +import json +import os +from datetime import datetime +from pathlib import Path +from typing import Any + +from dotenv import load_dotenv +from nltk.tokenize import word_tokenize # type: ignore +from openai import OpenAI + +load_dotenv() +client = OpenAI() + + +def llm_fuzzy_match(pred: str, reference: str, question: str) -> float: + """ + Evaluates if a predicted answer matches a reference answer semantically, considering the context of a question. + + This function simulates a grading scenario, understanding that a student's answer may use different wording or phrasing from the reference answer. It uses GPT-4-turbo model to assess semantic equivalence. + + Parameters: + pred (str): The student's predicted answer. + reference (str): The reference answer to compare against. + question (str): The question related to the answers. + + Returns: + float: Returns 1.0 if the predicted answer is semantically equivalent to the reference, otherwise 0.0. + """ + messages: list[dict[str, Any]] = [] + # construct the question to ask + message = "Help a teacher to grade the answer of a student given a question. Keep in mind that the student may use different phrasing or wording to answer the question. The goal is to evaluate whether the answer is semantically equivalent to the reference answer.\n" + message += f"question: {question}\n" + message += f"reference answer: {reference}\n" + message += "all the string 'N/A' that you see is a special sequence that means 'not achievable'\n" + message += f"student answer: {pred}\n" + message += "Conclude the judgement by correct/incorrect/partially correct." + messages = [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": message}, + ] + + response = generate_from_openai_chat_completion( + model="gpt-4-turbo-preview", + messages=messages, + temperature=0, + max_tokens=768, + top_p=1.0, + context_length=0, + ).lower() + if "partially correct" in response or "incorrect" in response: + return 0.0 + else: + assert "correct" in response + return 1.0 + + +def llm_ua_match(pred: str, reference: str, question: str) -> float: + """ + Evaluates the alignment between a reported reason for a task being unachievable and the actual reason. + + This function reviews both the actual and reported reasons for a task's unachievability within the context of the task. + It assesses if the reported reason is implicitly or explicitly in line with the actual reason, using GPT-turbo model. + + Parameters: + pred (str): The reported unachievable reason by an individual. + reference (str): The actual reason why the task is unachievable. + question (str): The task in question. + + Returns: + float: Returns 1.0 if the reported reason aligns with the actual reason, otherwise 0.0. + """ + messages: list[dict[str, Any]] = [] + # construct the question to ask + message = "" + message += f"task: {question}\n" + message += f"actual unachievable reason: {reference}\n" + message += f"reported unachievable reason: {pred}\n" + message += ( + "The task described above is inherently unachievable due to the reason specified under 'actual unachievable reason'. " + "An individual previously attempted this task and was unable to complete it. They provided a reason for their failure, " + "which is listed under 'reported unachievable reason'. Your role is to review both the actual and reported reasons. " + "Determine if the reported reason aligns with the actual reason, even if implicitly. " + "If the stated reason is in line with the actual reason, respond with 'same'. Otherwise, respond with 'different'." + ) + messages = [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": message}, + ] + + response = generate_from_openai_chat_completion( + model="gpt-4-turbo-preview", + messages=messages, + temperature=0, + max_tokens=768, + top_p=1.0, + context_length=0, + ).lower() + if "different" in response: + return 0.0 + else: + assert "same" in response + return 1.0 + + + +def generate_from_openai_chat_completion( + messages: list[dict[str, str]], + model: str, + temperature: float, + max_tokens: int, + top_p: float, + context_length: int, + stop_token: str | None = None, +) -> str: + """ + Generates a response from OpenAI's chat completions based on a conversation constructed from a list of messages. + + This function makes a call to the OpenAI API using specified parameters to control the generation. + It requires an API key to be set in the environment variables. + + Parameters: + messages (list[dict[str, str]]): A list of messages to construct the conversation context. + model (str): The model name to use for generating the completion. + temperature (float): Sampling temperature for generation. + max_tokens (int): Maximum number of tokens to generate. + top_p (float): Nucleus sampling parameter controlling the size of the probability mass to sample from. + context_length (int): The maximum number of tokens from `messages` to use for context. + stop_token (str, optional): A token at which to stop generating further tokens. + + Returns: + str: The generated response as a string. + + Raises: + ValueError: If the 'OPENAI_API_KEY' environment variable is not set. + """ + if "OPENAI_API_KEY" not in os.environ: + raise ValueError( + "OPENAI_API_KEY environment variable must be set when using OpenAI API." + ) + client.api_key = os.environ["OPENAI_API_KEY"] + client.organization = os.environ.get("OPENAI_ORGANIZATION", "") + + response = client.chat.completions.create( + model=model, + messages=messages, # type: ignore + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + n=1, + stop=[stop_token] if stop_token else None, + ) + answer: str = response.choices[0].message.content # type: ignore + return answer + +def clean_answer(answer: str) -> str: + """Cleans and preprocesses the answer string for evaluation. + + Parameters: + answer (str): The answer string to clean. + + Returns: + str: The cleaned and lowercased answer string. + """ + answer = answer.strip().strip('"').strip("'").lower() + return answer + +def evaluate_exact_match(ref: str, pred: str) -> float: + """Evaluates if the predicted answer exactly matches the reference answer. + + Parameters: + ref (str): The reference answer. + pred (str): The predicted answer. + + Returns: + float: 1.0 if the answers match exactly, otherwise 0.0. + """ + return float(clean_answer(pred) == clean_answer(ref)) + +def evaluate_must_include(ref: str, pred: str, tokenize: bool = False) -> float: + """Checks if the predicted answer includes all phrases from the reference answer. + + Parameters: + ref (str): The reference answer containing phrases that must be included. + pred (str): The predicted answer to be evaluated. + tokenize (bool, optional): Tokenizes the answers before evaluation if True. Default is False. + + Returns: + float: 1.0 if all phrases are included, otherwise 0.0. + """ + clean_ref = clean_answer(ref) + clean_pred = clean_answer(pred) + if tokenize and len(clean_ref) == 1: + return float(clean_ref in word_tokenize(clean_pred)) + else: + return float(clean_ref in clean_pred) + +def evaluate_fuzzy_match(ref: str, pred: str, intent: str) -> float: + """Evaluates if the predicted answer is semantically similar to the reference answer. + + Uses a large language model to assess similarity based on the intent of the question. + + Parameters: + ref (str): The reference answer. + pred (str): The predicted answer. + intent (str): The intent or context of the question. + + Returns: + float: 1.0 if the answers are considered semantically similar, otherwise 0.0. + """ + return llm_fuzzy_match(pred, ref, intent) + +def evaluate_ua_match(ref: str, pred: str, intent: str) -> float: + """Evaluates if the predicted reason for a task being unachievable matches the reference reason. + + Parameters: + ref (str): The reference reason why the task is unachievable. + pred (str): The predicted reason reported by the model. + intent (str): The intent or context of the task. + + Returns: + float: 1.0 if the reasons match, otherwise 0.0. + """ + return llm_ua_match(pred, ref, intent) + + +def load_config(config_file: Path | str) -> list[dict[str, Any]]: + """Load the confiufiguration for the test cases + + Args: + config_file (Path | str): Path to the config file + + Returns: + list[dict[str, Any]]: All the test cases in the config file + """ + with open(config_file, "r") as f: # noqa: UP015 + configs = json.load(f) + return configs + +def task_config_validator(task_config: dict[str, Any]) -> bool: + # Access the attributes + command = task_config.get('intent') + + if not command: + raise ValueError("Intent is missing in the task config file. Without it the task cannot be run.") + + return True + +def get_formatted_current_timestamp(format: str = "%Y-%m-%d %H:%M:%S") -> str: + """Get the current timestamp in the specified format. + + Args: + format (str, optional): The format of the timestamp. Defaults to "%Y-%m-%d %H:%M:%S". + + Returns: + str: The current timestamp in the specified format. + """ + # Get the current time + current_time = datetime.now() + + # Format the timestamp as a human-readable string + timestamp_str = current_time.strftime(format) + return timestamp_str diff --git a/Agent_E/test/tests_processor.py b/Agent_E/test/tests_processor.py new file mode 100644 index 0000000..28b6393 --- /dev/null +++ b/Agent_E/test/tests_processor.py @@ -0,0 +1,409 @@ +import asyncio +import json +import os +import time +from Agent_E.ae.core.agents_llm_config import AgentsLLMConfig +from Agent_E.test.test_utils import get_formatted_current_timestamp +from Agent_E.test.test_utils import load_config +from Agent_E.test.test_utils import task_config_validator +from typing import Any + +import Agent_E.ae.core.playwright_manager as browserManager +import nltk # type: ignore +from Agent_E.ae.config import PROJECT_TEST_ROOT +from Agent_E.ae.core.autogen_wrapper import AutogenWrapper +from Agent_E.ae.core.playwright_manager import PlaywrightManager +from Agent_E.ae.utils.logger import logger +from Agent_E.ae.utils.response_parser import parse_response +from autogen.agentchat.chat import ChatResult # type: ignore +from playwright.async_api import Page +from tabulate import tabulate +from termcolor import colored + +from evaluation_harness.evaluators import evaluator_router + +nltk.download('punkt') # type: ignore + +last_agent_response = "" + +def check_top_level_test_folders(test_log_dir, test_result_dir): + if not os.path.exists(test_log_dir): + os.makedirs(test_log_dir) + logger.info(f"Created log folder at: {test_log_dir}") + + if not os.path.exists(test_result_dir): + os.makedirs(test_result_dir) + logger.info(f"Created scores folder at: {test_result_dir}") + +def create_task_log_folders(test_log_dir, task_id): + task_log_dir = os.path.join(test_log_dir, task_id) + task_screenshots_dir = os.path.join(task_log_dir, 'snapshots') + if not os.path.exists(task_log_dir): + os.makedirs(task_log_dir) + logger.info(f"Created log dir for task {task_id} at: {task_log_dir}") + if not os.path.exists(task_screenshots_dir): + os.makedirs(task_screenshots_dir) + logger.info(f"Created screenshots dir for task {task_id} at: {task_screenshots_dir}") + + return {"task_log_folder": task_log_dir, "task_screenshots_folder": task_screenshots_dir} + + +def create_results_dir(test_file: str, test_results_id: str|None) -> str: + results_dir = "" + if test_results_id: + results_dir = os.path.join(TEST_RESULTS, f"results_for_{test_results_id}") + else: + test_file_base = os.path.basename(test_file) + test_file_name = os.path.splitext(test_file_base)[0] + results_dir = os.path.join(TEST_RESULTS, f"results_for_test_file_{test_file_name}") + + if not os.path.exists(results_dir): + os.makedirs(results_dir) + logger.info(f"Created results directory: {results_dir}") + + return results_dir + + +def dump_log(task_id: str, messages_str_keys: dict[str, str], logs_dir: str): + file_name = os.path.join(logs_dir, f'execution_logs_{task_id}.json') + with open(file_name, 'w', encoding='utf-8') as f: + json.dump(messages_str_keys, f, ensure_ascii=False, indent=4) + + +def save_test_results(test_results: list[dict[str, str | int | float | None]], test_results_id: str): + file_name = os.path.join(TEST_RESULTS, f'test_results_{test_results_id}.json') + with open(file_name, 'w', encoding='utf-8') as f: + json.dump(test_results, f, ensure_ascii=False, indent=4) + logger.info(f"Test results dumped to: {file_name}") + + +def save_individual_test_result(test_result: dict[str, str | int | float | None], results_dir: str): + task_id = test_result["task_id"] + file_name = os.path.join(results_dir, f'{task_id}.json') + with open(file_name, 'w', encoding='utf-8') as f: + json.dump(test_result, f, ensure_ascii=False, indent=4) + logger.info(f"Test result for task {task_id} dumped to: {file_name}") + + +def extract_last_response(messages: list[dict[str, Any]]) -> str: + """Extract the last response message from chat history.""" + try: + # Iterate over the messages in reverse order + for message in reversed(messages): + if message and 'content' in message: + content=message.get('content', "") + content_json = parse_response(content) + final_answer = content_json.get('final_response', None) + if final_answer: + return final_answer + return "" + except: + logger.error("Error extracting last response from chat history.") + return "" + + +def print_progress_bar(current: int, total: int, bar_length: int = 50) -> None: + """ + Prints a progress bar to the console. + + Parameters: + - current (int): The current progress of the task. + - total (int): The total number of tasks to complete. + - bar_length (int): The character length of the progress bar (default is 50). + + This function dynamically updates a single line in the console to reflect current progress. + + """ + percent = float(current) * 100 / total + arrow = '-' * int(percent/100 * bar_length - 1) + '>' + spaces = ' ' * (bar_length - len(arrow)) + + print(f'\rProgress: [{arrow}{spaces}] {current}/{total} ({percent:.2f}%)', end='') + +def determine_status_and_color(score: float) -> tuple[str, str]: + """ + Determines the status and color for a test result based on the score. + + Parameters: + - score (float): The score of the test task, indicating success (1), failure (0), or skip (-0.1). + + Returns: + - tuple[str, str]: A tuple containing the status ('Pass', 'Fail', or 'Skip') and the corresponding color ('green', 'red', or 'yellow'). + + """ + if score == 1: + return 'Pass', 'green' + elif score < 0: + return 'Skip', 'yellow' + else: + return 'Fail', 'red' + + +def print_test_result(task_result: dict[str, str | int | float | None], index: int, total: int) -> None: + """ + Prints the result of a single test task in a tabulated format. + + Parameters: + - task_result (dict): A dictionary containing the task's evaluation results, including task ID, intent, score, and total command time. + - index (int): The current index of the test in the sequence of all tests being run. + - total (int): The total number of tests to be run. + + The function determines the test status (Pass/Fail) based on the 'score' key in task_result and prints the result with colored status. + + """ + status, color = determine_status_and_color(task_result['score']) # type: ignore + + cost = task_result.get("compute_cost", None) + total_cost = None if cost is None else round(cost.get("cost", -1), 4) # type: ignore + total_tokens = None if cost is None else cost.get("total_tokens", -1) # type: ignore + result_table = [ # type: ignore + ['Test Index', 'Task ID', 'Intent', 'Status', 'Time Taken (s)', 'Total Tokens', 'Total Cost ($)'], + [index, task_result['task_id'], task_result['intent'], colored(status, color), round(task_result['tct'], 2), total_tokens, total_cost] # type: ignore + ] + print('\n' + tabulate(result_table, headers='firstrow', tablefmt='grid')) # type: ignore + +def get_command_exec_cost(command_exec_result: ChatResult): + output: dict[str, Any] = {} + try: + cost = command_exec_result.cost # type: ignore + usage: dict[str, Any] = None + if "usage_including_cached_inference" in cost: + usage: dict[str, Any] = cost["usage_including_cached_inference"] + elif "usage_excluding_cached_inference" in cost: + usage: dict[str, Any] = cost["usage_excluding_cached_inference"] + else: + raise ValueError("Cost not found in the command execution result.") + print("Usage: ", usage) + + for key in usage.keys(): + if isinstance(usage[key], dict) and "prompt_tokens" in usage[key]: + output["cost"] = usage[key]["cost"] + output["prompt_tokens"] = usage[key]["prompt_tokens"] + output["completion_tokens"] = usage[key]["completion_tokens"] + output["total_tokens"] = usage[key]["total_tokens"] + except Exception as e: + logger.debug(f"Error getting command execution cost: {e}") + return output + + +async def execute_single_task(task_config_file: str, browser_manager: PlaywrightManager, ag: AutogenWrapper, page: Page, logs_dir: str) -> dict[str, Any]: + """ + Executes a single test task based on a specified task configuration and evaluates its performance. + + Parameters: + - task_config (dict): The task configuration dictionary containing all necessary parameters for the task. + - browser_manager (PlaywrightManager): The manager handling browser interactions, responsible for page navigation and control. + - ag (AutogenWrapper): The automation generator wrapper that processes commands and interacts with the web page. + - page (Page): The Playwright page object representing the browser tab where the task is executed. + + Returns: + - dict: A dictionary containing the task's evaluation results, including task ID, intent, score, total command time (tct), + the last statement from the chat agent, and the last URL accessed during the task. + """ + command = "" + start_url = None + task_id = None + + start_ts = get_formatted_current_timestamp() + + task_config = json.load(open(task_config_file, "r")) + + task_config_validator(task_config) + + command: str = task_config.get('intent', "") + task_id = task_config.get('task_id') + task_index = task_config.get('task_index') + start_url = task_config.get('start_url') + logger.info(f"Intent: {command}, Task ID: {task_id}") + + if start_url: + await page.goto(start_url, wait_until='load', timeout=30000) + + start_time = time.time() + current_url = await browser_manager.get_current_url() + command_exec_result = await ag.process_command(command, current_url) + end_time = time.time() + + evaluator_result: dict[str, float | str] = {} + last_agent_response: str = "" + command_cost: dict[str, Any] = {} + single_task_result: dict[str, Any] = {} + try: + single_task_result = { + "task_id": task_id, + "task_index": task_index, + "start_url": start_url, + "intent": str(command), + "last_url": page.url, + "tct": end_time - start_time, + "start_ts": start_ts, + "completion_ts": get_formatted_current_timestamp() + } + + agent_name: str = "planner_agent" if ag.agents_map is not None and "planner_agent" in ag.agents_map else "browser_nav_agent" + + command_cost = get_command_exec_cost(command_exec_result) # type: ignore + print(f"Command cost: {command_cost}") + single_task_result["compute_cost"] = command_cost + + logger.info(f"Command \"{command}\" took: {round(end_time - start_time, 2)} seconds.") + logger.info(f"Task {task_id} completed.") + + messages = ag.agents_map[agent_name].chat_messages # type: ignore + messages_str_keys = {str(key): value for key, value in messages.items()} # type: ignore + agent_key = list(messages.keys())[0] # type: ignore + last_agent_response = extract_last_response(messages[agent_key]) # type: ignore + + dump_log(str(task_id), messages_str_keys, logs_dir) + + single_task_result["last_statement"] = last_agent_response + + + evaluator = evaluator_router(task_config_file) + # cdp_session = await page.context.new_cdp_session(page) + evaluator_result = evaluator( + config_file=task_config_file, + page=None, + client=None, + trajectory=[{"answer":last_agent_response}] + ) + + single_task_result["score"] = evaluator_result + except Exception as e: + logger.error(f"Error getting command cost: {e}") + command_cost = {"cost": -1, "total_tokens": -1} + single_task_result["compute_cost"] = command_cost + single_task_result["error"] = str(e) + + return single_task_result + + +async def run_tests(ag: AutogenWrapper, browser_manager: PlaywrightManager, task_ids, + logdir: str="", logname: str="", relative_task_dir: str="", test_results_id: str = "", wait_time_non_headless: int=5, take_screenshots: bool = False) -> list[dict[str, Any]]: + """ + Runs a specified range of test tasks using Playwright for browser interactions and AutogenWrapper for task automation. + It initializes necessary components, processes each task, handles exceptions, and compiles test results into a structured list. + + Parameters: + - ag (AutogenWrapper): The AutoGen wrapper that processes commands. + - browser_manager (PlaywrightManager): The manager handling browser interactions, responsible for page navigation and control. + - logdir (str) + - logname (str) + - task_ids (List[str]) + - relative_task_dir (str) + - wait_time_non_headless (int): Time to wait between tasks when running in non-headless mode, useful for live monitoring or debugging. + - take_screenshots (bool): Whether to take screenshots during test execution. Defaults to False. + + Returns: + - list[dict[str, Any]]: A list of dictionaries, each containing the results from executing a test task. Results include task ID, intent, score, total command time, etc. + + This function also manages logging and saving of test results, updates the progress bar to reflect test execution status, and prints a detailed summary report at the end of the testing session. + """ + test_log_dir = os.path.join(logdir, logname) + test_result_dir = os.path.join(logdir, logname, "results") + check_top_level_test_folders(test_log_dir, test_result_dir) + + config_file_list = [] + if not relative_task_dir or relative_task_dir == "": + relative_task_dir = "tasks" + if task_ids == "all" or task_ids == ["all"]: + task_ids = [filename[:-len(".json")] for filename in os.listdir(f"config_files/{relative_task_dir}") if filename.endswith(".json")] + for task_id in task_ids: + config_file_list.append(f"config_files/{relative_task_dir}/{task_id}.json") + + test_results: list[dict[str, str | int | float | None]] = [] + + llm_config = AgentsLLMConfig() + if not ag: + ag = await AutogenWrapper.create(llm_config.get_planner_agent_config(), llm_config.get_browser_nav_agent_config()) + + if not browser_manager: + browser_manager = browserManager.PlaywrightManager(headless=True) + await browser_manager.async_initialize() + + page=await browser_manager.get_current_page() + test_results = [] + total_tests = len(config_file_list) + + for index, task_config_file in enumerate(config_file_list): + task_config = json.load(open(task_config_file, "r")) + task_id = str(task_config.get('task_id')) + if os.path.exists(os.path.join(test_result_dir, f'{task_id}.json')): + continue + + log_folders = create_task_log_folders(test_log_dir, task_id) + + ag.set_chat_logs_dir(log_folders["task_log_folder"]) + + browser_manager.set_take_screenshots(take_screenshots) + if take_screenshots: + browser_manager.set_screenshots_dir(log_folders["task_screenshots_folder"]) + + print_progress_bar(index, total_tests) + task_result = await execute_single_task(task_config_file, browser_manager, ag, page, log_folders["task_log_folder"]) + test_results.append(task_result) + save_individual_test_result(task_result, test_result_dir) + print_test_result(task_result, index + 1, total_tests) + + if not browser_manager.isheadless: # no need to wait if we are running headless + await asyncio.sleep(wait_time_non_headless) # give time for switching between tasks in case there is a human observer + + await browser_manager.take_screenshots("final", None) + + await browser_manager.close_except_specified_tab(page) # cleanup pages that are not the one we opened here + + print_progress_bar(total_tests, total_tests) # Complete the progress bar + print('\n\nAll tests completed.') + + # Aggregate and print individual test results + print("\nDetailed Test Results:") + detailed_results_table = [['Test Index', 'Task ID', 'Intent', 'Status', 'Time Taken (s)', 'Total Tokens', 'Total Cost ($)']] + for idx, result in enumerate(test_results, 1): + status, color = determine_status_and_color(result['score']) # type: ignore + + cost: str | int | float | None = result.get("compute_cost", None) + total_cost = None if cost is None else round(cost.get("cost", -1), 4) # type: ignore + total_tokens = None if cost is None else cost.get("total_tokens", -1) # type: ignore + + detailed_results_table.append([ + idx, result['task_id'], result['intent'], colored(status, color), round(result['tct'], 2), # type: ignore + total_tokens, total_cost + ]) + + print(tabulate(detailed_results_table, headers='firstrow', tablefmt='grid')) + + # Summary report + + # Calculate aggregated cost and token totals for all tests that have compute cost + total_cost = 0 + total_tokens = 0 + + for result in test_results: + compute_cost = result.get("compute_cost",0) # type: ignore + if compute_cost is not None and isinstance(compute_cost, dict): + total_cost += compute_cost.get("cost", 0) # type: ignore + total_tokens += compute_cost.get("total_tokens", 0) # type: ignore + + passed_tests = [] + skipped_tests = [] + failed_tests = [] + for result in test_results: + if result["score"] == 1: + passed_tests.append(result) # type: ignore + elif result["score"] < 0: # type: ignore + skipped_tests.append(result) # type: ignore + else: + failed_tests.append(result) # type: ignore + + summary_table = [ # type: ignore + ['Total Tests', 'Passed', 'Failed', 'Skipped', 'Average Time Taken (s)', 'Total Time Taken (s)', 'Total Tokens', 'Total Cost ($)'], + [total_tests, len(passed_tests), len(failed_tests), len(skipped_tests), + round(sum(test['tct'] for test in test_results) / total_tests, 2), # type: ignore + round(sum(test['tct'] for test in test_results), 2), # type: ignore + total_tokens, total_cost] + ] + + print('\nSummary Report:') + print(tabulate(summary_table, headers='firstrow', tablefmt='grid')) # type: ignore + + return test_results diff --git a/README.md b/README.md index 847260c..bc425a2 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,227 @@ -## My Project +# AgentOccam +Code for "[AgentOccam: A Simple Yet Strong Baseline for LLM-Based Web Agents]()". -TODO: Fill this README out! +![](files/overview.png) -Be sure to: +We work on automating web tasks! 🏄🏄🏄 We refine the LLM-based web agents by aligning their observation and action space with the capabilities of LLMs. -* Change the title in this README -* Edit your repository description on GitHub +The newly designed agent AgentOccam surpasses previous state-of-the-art methods and concurrent work significantly w/o in-context examples, new agent roles, online feedback or search strategies on [WebArena](https://webarena.dev), a benchmark featuring general-purpose web tasks. 🍺 -## Security +We shed light on LLMs' impressive zero-shot performance on web tasks, and the critical role of carefully tuning observation and action spaces for LLM-based agents. 🧙 -See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. +You can let AgentOccam interact with other websites like Google per your requests by defining the task config files, as seen in the example in `config_files/tasks/standford_cs_head.json`. Have fun playing with it! :) -## License +*Please check whether reddit post exceeds limits, login expires, or any other webarena simulator/website failure exists when you finish one round. You should restart the simluator/relogin to the websites and rerun those tasks before reporting your final success rate. Additionally, LLM policy varies even given the same task as the generation temperature is set to >0 for more diverse exploration. Therefore, it is expected that you can get difference traces when starting the same task multiple times. Try it out with the basic `config_files/tasks/standford_cs_head.json`!* -This project is licensed under the Apache-2.0 License. +## WebArena Replication +### Environment Setup +```bash +git clone https://github.com/web-arena-x/webarena.git +cd webarena +conda create -n webarena python=3.10; conda activate webarena +pip install -r requirements.txt +pip install --upgrade transformers +pip install --upgrade openai +pip install numpy==1.26.4 +playwright install +pip install -e . +cd ../AgentOccam +pip install -r requirements.txt +mkdir .auth +``` +### Experiments +#### AgentOccam-Series and SteP-Replication +* Connect to the WebArena host server. +* Export the env configs: +```bash +export SHOPPING="http://:7770" +export SHOPPING_ADMIN="http://:7780/admin" +export REDDIT="http://:9999" +export GITLAB="http://:8023" +export MAP="http://:3000" +export WIKIPEDIA="http://:8888/wikipedia_en_all_maxi_2022-05/A/User:The_other_Kiwix_guy/Landing" +export HOMEPAGE="http://:4399" +export OPENAI_API_KEY="" +export GEMINI_API_KEY="" +``` +* Login in: +```bash +python browser_env/auto_login.py +``` +* Test AgentOccam: +```bash +python eval_webarena.py --config AgentOccam/configs/AgentOccam.yml # Replace the yml config with your target one. +``` +*You can use directly run `bash script/run_config.sh` after replacing the experiment configurations.* +#### WebArena-Replication +```bash +bash scripts/run_webarena.sh +``` + +## WebVoyager Replication +### Environment Setup +```bash +git clone https://github.com/EmergenceAI/Agent-E.git +cd Agent-E +./install.sh +source .venv/bin/activate +uv pip install beartype +uv pip install gymnasium +uv pip install lxml +uv pip install text_generation +uv pip install aiolimiter +uv pip install boto3 +uv pip install transformers +export OPENAI_API_KEY="" +export AUTOGEN_MODEL_NAME="gpt-4-turbo" +cd ../AgentOccam +``` +### Experiments +#### AgentOccam +```bash +python eval_webarena.py --config AgentOccam/configs/AgentOccam-WebVoyager.yml +``` +#### Agent-E +```bash +python -m agente_replication --task_ids Allrecipes--3 +``` + + + +## Agent Configuration Explanation + +They following are compiled based on `AgentOccam/configs/AgentOccam.yml`. + +### General + +```yml +logdir: "../AgentOccam-Trajectories" +``` + +This determines where the trajectories will be saved. Use relative path. + +```yml +logname: "AgentOccam" +agent: + others: + logname: "AgentOccam" +``` + +All relevant online files (play series, trash series, and output/screenshot series) will use this log name to differentiate. Change them simultaneously. + +### Agent +#### Base +```yml +agent: + actor: + debug: 0 + verbose: 1 + number: 1 + critic: + mode: false + debug: 0 + verbose: 1 + judge: + mode: false + debug: 0 + verbose: 1 +``` + +All roles have a `debug` key. When `debug==1`, it plays and you decide whether to take its action. When `debug==2`, you will have to generate the action yourself. The actor is always playing so there's no `mode` key for it. For other roles, you can disable them by changing `mode` to false. + +```yml +agent: + actor: + model: "gpt-4-turbo" +``` + +determines which model to use. + +```yml +agent: + actor: + input: ["step", "objective", "previous plans", "interaction history", "current observation"] +``` +arranges the input. The list element order matters here and this applies to all the following list input/output specifications. + +```yml +agent: + actor: + interaction_history: + verbose: True + type: ["text"] + step_num: 3 +``` +determines the interaction history section input type and modality. You can use `type: ["text", "image"]` to enable multimodality inputs. + +```yml +agent: + actor: + current_observation: + type: ["text"] +``` +defines the current observation type. + +```yml +agent: + actor: + output: ["interaction history summary", "observation description", "reason", "action", "observation highlight"] +``` +organize the output specifications, and capable LLMs should generate those content, which would be parsed automatically by the code. You only need to add the description for that entry under `AgentOccam/prompts/output_specifications`. + +```yml +agent: + actor: + planning_command: ["branch", "prune"] + navigation_command: ["click", "type", "stop", "note", "go_back"] +``` +defines the valid actions. + +```yml +agent: + actor: + play: ["step", "objective", "previous plans", "observation description", "reason", "action"] + trash: ["objective", "step", "url", "instruction", "online input", "response", "alter ego response"] +``` +designates the broadcasting content. + +#### Advanced +```yml +agent: + actor: + number: 1 +``` +If you use best-of-**N**-actions with judge, the `number` here defines the **N**. + +```yml +agent: + actor: + identities: + identity_0: + name: "QA" + model: "gpt-4-turbo" + output: ["response"] + identity_1: + name: "planning" + model: "gpt-4-turbo" + planning_command: ["branch", "prune"] + output: ["interaction history summary", "observation description", "reason", "plan", "observation highlight"] + identity_2: + name: "reflection" + model: "gpt-4-turbo" + planning_command: ["branch", "prune"] + navigation_command: ["click", "type", "stop", "note", "go_back"] + output: ["interaction history summary", "observation description", "reflection", "reason", "action", "observation highlight"] +``` +defines different actors. If you don't want them, comment them. + +## Environment +```yml +env: + fullpage: true + prune: true +``` +If `fullpage==True`, the agent takes the entire page as the input. Remember to add `scroll` to the `navigation_action` list if `fullpage` is disabled. + +If `prune==True`, the pipeline carries out observation space alignment. \ No newline at end of file diff --git a/agente_replication.py b/agente_replication.py new file mode 100644 index 0000000..cd09d54 --- /dev/null +++ b/agente_replication.py @@ -0,0 +1,29 @@ +import argparse +import asyncio +from Agent_E.test.tests_processor import run_tests + +if __name__ == "__main__": + # Create the parser + parser = argparse.ArgumentParser(description='Run test suite for specified range of test tasks.') + + # Add arguments + parser.add_argument('-s', '--take_screenshots', type=bool, default=False, + help='Take screenshots after every operation performed (default: False)') + parser.add_argument('-wait', '--wait_time_non_headless', type=int, default=5, + help='Time to wait between test tasks when running in non-headless mode (default: 10 seconds)') + parser.add_argument("-ids", "--task_ids", type=str, nargs='+', help="List of task IDs to execute") + parser.add_argument('-dir', '--logdir', type=str, default="../AgentOccam-Trajectories", + help='Logdir.') + parser.add_argument('-log', '--logname', type=str, default="Agent-E", + help='Logname.') + parser.add_argument('-id', '--test_results_id', type=str, default="", + help='A unique identifier for the test results. If not provided, a timestamp is used.') + parser.add_argument('-config', '--relative_task_dir', type=str, default="webvoyager", + help='Path to the test configuration file.') + + # Parse the command line arguments + args = parser.parse_args() + + # Run the main function with the provided or default arguments, not passing browser_manager or AutoGenWrapper will cause the test processor to create new instances of them + asyncio.run(run_tests(None, None, args.task_ids, logdir=args.logdir, logname=args.logname, relative_task_dir=args.relative_task_dir, + take_screenshots=args.take_screenshots, wait_time_non_headless=args.wait_time_non_headless)) diff --git a/browser_env/__init__.py b/browser_env/__init__.py new file mode 100644 index 0000000..53e06be --- /dev/null +++ b/browser_env/__init__.py @@ -0,0 +1,78 @@ +import asyncio + +from .actions import ( + Action, + ActionParsingError, + ActionTypes, + action2create_function, + action2str, + create_check_action, + create_click_action, + create_focus_and_click_action, + create_focus_and_type_action, + create_go_back_action, + create_go_forward_action, + create_goto_url_action, + create_hover_action, + create_id_based_action, + create_id_based_actions, + create_key_press_action, + create_keyboard_type_action, + create_mouse_click_action, + create_mouse_hover_action, + create_new_tab_action, + create_none_action, + create_page_close_action, + create_page_focus_action, + create_playwright_action, + create_random_action, + create_scroll_action, + create_select_option_action, + create_stop_action, + create_type_action, + is_equivalent, +) +from .async_envs import AsyncScriptBrowserEnv +from .envs import ScriptBrowserEnv +from .processors import ObservationMetadata +from .trajectory import Trajectory +from .utils import DetachedPage, StateInfo + +__all__ = [ + "ScriptBrowserEnv", + "AsyncScriptBrowserEnv", + "DetachedPage", + "StateInfo", + "ObservationMetadata", + "Action", + "ActionTypes", + "action2str", + "create_random_action", + "create_focus_and_click_action", + "create_focus_and_type_action", + "is_equivalent", + "create_mouse_click_action", + "create_mouse_hover_action", + "create_none_action", + "create_keyboard_type_action", + "create_page_focus_action", + "create_new_tab_action", + "create_go_back_action", + "create_go_forward_action", + "create_goto_url_action", + "create_page_close_action", + "action2create_function", + "create_playwright_action", + "create_id_based_action", + "create_id_based_actions", + "create_scroll_action", + "create_key_press_action", + "create_check_action", + "create_click_action", + "create_type_action", + "create_hover_action", + "create_select_option_action", + "create_stop_action", + "ActionParsingError", + "Trajectory", +] diff --git a/browser_env/actions.py b/browser_env/actions.py new file mode 100644 index 0000000..9de1c18 --- /dev/null +++ b/browser_env/actions.py @@ -0,0 +1,1948 @@ +""" +Browser Env action space. +Inspited by Farama-Foundation/miniwob-plusplus +""" +import ast +import random +import re +import string +from enum import IntEnum +from itertools import chain +from typing import Any, TypedDict, Union, cast +import time + +import numpy as np +import numpy.typing as npt +from beartype import beartype +from gymnasium import spaces +from playwright._impl._api_structures import ViewportSize +from playwright.async_api import BrowserContext as ABrowserContext +from playwright.async_api import Locator as ALocator +from playwright.async_api import Page as APage +from playwright.sync_api import BrowserContext, Locator, Page + +from browser_env.constants import ( + ASCII_CHARSET, + FREQ_UNICODE_CHARSET, + MAX_ANSWER_LENGTH, + MAX_ELEMENT_ID, + MAX_ELEMENT_INDEX_IN_VIEWPORT, + MAX_PAGE_NUMBER, + MAX_VANILLA_STR_LENGTH, + PLAYWRIGHT_ACTIONS, + PLAYWRIGHT_LOCATORS, + ROLES, + SPECIAL_KEY_MAPPINGS, + SPECIAL_KEYS, + SPECIAL_LOCATORS, + TEXT_MAX_LENGTH, + TYPING_MAX_LENGTH, + URL_MAX_LENGTH, + RolesType, +) +from browser_env.processors import ObservationProcessor + + +class ParsedPlaywrightCode(TypedDict): + function_name: str + arguments: list[str] + keywords: dict[str, Any] + + +from browser_env.processors import ( + ObservationProcessor, + TextObervationProcessor, +) + + +def is_in_viewport( + element: Locator, viewport: ViewportSize, threshold: float = 0.3 +) -> bool: + """Given a playwright locator, check if it is in the viewport""" + box = element.bounding_box() + assert box is not None + boxx0 = box["x"] + boxx1 = box["x"] + box["width"] + boxy0 = box["y"] + boxy1 = box["y"] + box["height"] + viewportx0, viewporty0 = 0, 0 + viewportx1, viewporty1 = viewport["width"], viewport["height"] + inter = max(0, min(boxx1, viewportx1) - max(boxx0, viewportx0)) * max( + 0, min(boxy1, viewporty1) - max(boxy0, viewporty0) + ) + ratio = inter / (box["width"] * box["height"]) + return ratio > threshold + + +async def async_is_in_viewport( + element: ALocator, viewport: ViewportSize, threshold: float = 0.3 +) -> bool: + box = await element.bounding_box() + assert box is not None + boxx0 = box["x"] + boxx1 = box["x"] + box["width"] + boxy0 = box["y"] + boxy1 = box["y"] + box["height"] + viewportx0, viewporty0 = 0, 0 + viewportx1, viewporty1 = viewport["width"], viewport["height"] + inter = max(0, min(boxx1, viewportx1) - max(boxx0, viewportx0)) * max( + 0, min(boxy1, viewporty1) - max(boxy0, viewporty0) + ) + ratio = inter / (box["width"] * box["height"]) + return ratio > threshold + + +class Action(TypedDict): + action_type: int + coords: npt.NDArray[np.float32] + element_role: int + element_name: str + text: list[int] + page_number: int + url: str + nth: int + element_id: str + direction: str + key_comb: str + pw_code: str + answer: str + raw_prediction: str # raw prediction from the model + + +@beartype +def action2str( + action: Action, action_set_tag: str, semantic_element: str = "" +) -> str: + """Return the string representation of an action + + sementic_element: the semantic information of the element + such as a line in an accessibility tree + """ + if action_set_tag == "id_accessibility_tree": + element_id = action["element_id"] + match action["action_type"]: + case ActionTypes.CLICK: + # [ID=X] xxxxx + action_str = f"click [{element_id}] where [{element_id}] is {semantic_element}" + case ActionTypes.TYPE: + text = "".join([_id2key[i] for i in action["text"]]) + text = text.replace("\n", " ") + action_str = f"type [{element_id}] [{text}] where [{element_id}] is {semantic_element}" + case ActionTypes.HOVER: + action_str = f"hover [{element_id}] where [{element_id}] is {semantic_element}" + case ActionTypes.SCROLL: + action_str = f"scroll [{action['direction']}]" + case ActionTypes.KEY_PRESS: + action_str = f"press [{action['key_comb']}]" + case ActionTypes.GOTO_URL: + action_str = f"goto [{action['url']}]" + case ActionTypes.NEW_TAB: + action_str = "new_tab" + case ActionTypes.PAGE_CLOSE: + action_str = "close_tab" + case ActionTypes.GO_BACK: + action_str = "go_back" + case ActionTypes.GO_FORWARD: + action_str = "go_forward" + case ActionTypes.PAGE_FOCUS: + action_str = f"page_focus [{action['page_number']}]" + case ActionTypes.STOP: + action_str = f"stop [{action['answer']}]" + case ActionTypes.NONE: + action_str = "none" + case _: + raise ValueError( + f"Unknown action type {action['action_type']}" + ) + elif action_set_tag == "id_html_tree": + element_id = action["element_id"] + label = action.get("label", "") + match action["action_type"]: + case ActionTypes.CLICK: + # [ID=X] xxxxx + action_str = f"#Click# {label}" + case ActionTypes.TYPE: + text = "".join([_id2key[i] for i in action["text"]]) + text = text.replace("\n", " ") + action_str = f"#Type# {label} {text}" + case ActionTypes.HOVER: + action_str = f"#Hover# {label}" + case ActionTypes.SCROLL: + action_str = f"#Scroll_{action['direction']}#" + case ActionTypes.KEY_PRESS: + action_str = f"#Press# {action['key_comb']}" + case ActionTypes.GOTO_URL: + action_str = f"#Goto# {action['url']}" + case ActionTypes.NEW_TAB: + action_str = "new_tab" + case ActionTypes.PAGE_CLOSE: + action_str = "close_tab" + case ActionTypes.GO_BACK: + action_str = "#Go_backward#" + case ActionTypes.GO_FORWARD: + action_str = "#Go_forward#" + case ActionTypes.PAGE_FOCUS: + action_str = f"page_focus [{action['page_number']}]" + case ActionTypes.STOP: + if len(action['answer']) > 0: + action_str = f"#Answer# {action['answer']}" + else: + action_str = f"#Exit#" + case ActionTypes.SELECT_OPTION: + option = action.get("option", "") + action_str = f"#Select# {label} {option}" + case ActionTypes.NONE: + action_str = "None" + case _: + raise ValueError( + f"Unknown action type {action['action_type']}" + ) + elif action_set_tag == "id_html_nasc_tree": + element_id = action["element_id"] + label = action["label"] + flag = action["flag"] + + match action["action_type"]: + case ActionTypes.CLICK: + # [ID=X] xxxxx + action_str = f"click('{label}')" + case ActionTypes.TYPE: + text = "".join([_id2key[i] for i in action["text"]]) + text = text.replace("\n", " ") + action_str = f"type_string('{label}', '{text}', {flag})" + case ActionTypes.HOVER: + action_str = f"hover('{label}')" + case ActionTypes.SCROLL: + action_str = f"scroll_page('{action['direction']}')" + case ActionTypes.KEY_PRESS: + action_str = f"press('{action['key_comb']}')" + case ActionTypes.GOTO_URL: + action_str = f"jump_to('{action['url']}', {flag})" + case ActionTypes.NEW_TAB: + action_str = "new_tab" + case ActionTypes.PAGE_CLOSE: + action_str = "close_tab" + case ActionTypes.GO_BACK: + action_str = "go('backward')" + case ActionTypes.GO_FORWARD: + action_str = "go('forward')" + case ActionTypes.PAGE_FOCUS: + action_str = f"switch_tab('{action['page_number']}')" + case ActionTypes.STOP: + if len(action['answer']) > 0: + action_str = f"finish('{action['answer']}')" + else: + action_str = f"finish()" + case ActionTypes.SELECT_OPTION: + option = action.get("option", "") + action_str = f"select('{label}', '{option}')" + case ActionTypes.NONE: + action_str = "no_op()" + case _: + raise ValueError( + f"Unknown action type {action['action_type']}" + ) + else: + raise NotImplementedError(f"Unknown action set tag {action_set_tag}") + + return action_str + + +@beartype +def action2create_function(action: Action) -> str: + match (action["action_type"]): + case ActionTypes.NONE: + return "create_none_action()" + # mouse wheel and keyboard action + case ActionTypes.SCROLL: + direction = "up" if "up" in action["direction"] else "down" + return f"create_scroll_action({repr(direction)})" + case ActionTypes.KEY_PRESS: + return f"create_key_press_action({repr(action['key_comb'])})" + # inter-page actions + case ActionTypes.PAGE_FOCUS: + return f"create_page_focus_action({action['page_number']})" + case ActionTypes.NEW_TAB: + return "create_new_tab_action()" + case ActionTypes.GO_BACK: + return "create_go_back_action()" + case ActionTypes.GO_FORWARD: + return "create_go_forward_action()" + case ActionTypes.GOTO_URL: + return f"create_goto_url_action({repr(action['url'])})" + case ActionTypes.PAGE_CLOSE: + return "create_page_close_action()" + + # low-level keyboard and mouse actions + case ActionTypes.MOUSE_CLICK: + return f"create_mouse_click_action({action['coords'][0]}, {action['coords'][1]})" + case ActionTypes.MOUSE_HOVER: + return f"create_mouse_hover_action({action['coords'][0]}, {action['coords'][1]})" + case ActionTypes.KEYBOARD_TYPE: + return f"create_keyboard_type_action({list(map(lambda x: _id2key[x], action['text']))})" + + # mid-level keyboard and mouse actions + case ActionTypes.CLICK: + args = [] + args.append(f"element_id={repr(action['element_id'])}") + args.append( + f"element_role={repr(_id2role[action['element_role']])}" + ) + args.append(f"element_name={repr(action['element_name'])}") + args.append(f"pw_code={repr(action['pw_code'])}") + args_str = ", ".join(args) + return f"create_click_action({args_str})" + case ActionTypes.HOVER: + args = [] + args.append(f"element_id={repr(action['element_id'])}") + args.append( + f"element_role={repr(_id2role[action['element_role']])}" + ) + args.append(f"element_name={repr(action['element_name'])}") + args.append(f"pw_code={repr(action['pw_code'])}") + args_str = ", ".join(args) + return f"create_hover_action({args_str})" + case ActionTypes.TYPE: + args = [] + text = "".join(map(lambda x: _id2key[x], action["text"])) + args.append(f"text={repr(text)}") + args.append(f"element_id={repr(action['element_id'])}") + args.append( + f"element_role={repr(_id2role[action['element_role']])}" + ) + args.append(f"element_name={repr(action['element_name'])}") + args.append(f"pw_code={repr(action['pw_code'])}") + args_str = ", ".join(args) + return f"create_type_action({args_str})" + + # high-level actions, only support locators from playwright + case ActionTypes.CHECK: + return f"create_check_action(pw_code={repr(action['pw_code'])})" + case ActionTypes.SELECT_OPTION: + return f"create_select_option_action(pw_code={repr(action['pw_code'])})" + case ActionTypes.STOP: + return f'create_stop_action({repr(action["answer"])})' + + raise ValueError(f"Invalid action type: {action['action_type']}") + + +class ActionTypes(IntEnum): + """Valid action types for browser env.""" + + NONE = 0 + # mouse wheel and keyboard, universal across all action spaces + SCROLL = 1 + KEY_PRESS = 2 + + # low level mouse and keyboard actions + MOUSE_CLICK = 3 + KEYBOARD_TYPE = 4 + MOUSE_HOVER = 5 + + # mid level mouse and keyboard actions + CLICK = 6 + TYPE = 7 + HOVER = 8 + + # page level actions, universal across all action spaces + PAGE_FOCUS = 9 + NEW_TAB = 10 + GO_BACK = 11 + GO_FORWARD = 12 + GOTO_URL = 13 + PAGE_CLOSE = 14 + + # high-leval actions that playwright support + CHECK = 15 + SELECT_OPTION = 16 + + STOP = 17 + + def __str__(self) -> str: + return f"ACTION_TYPES.{self.name}" + + +@beartype +def is_equivalent(a: Action, b: Action) -> bool: + """Return True if two actions are equal.""" + if a["action_type"] != b["action_type"]: + return False + match (a["action_type"]): + case ActionTypes.NONE: + return True + case ActionTypes.SCROLL: + da = "up" if "up" in a["direction"] else "down" + db = "up" if "up" in b["direction"] else "down" + return da == db + case ActionTypes.KEY_PRESS: + return a["key_comb"] == b["key_comb"] + case ActionTypes.MOUSE_CLICK | ActionTypes.MOUSE_HOVER: + return np.allclose(a["coords"], b["coords"]) + case ActionTypes.KEYBOARD_TYPE: + return a["text"] == b["text"] + case ActionTypes.CLICK | ActionTypes.HOVER | ActionTypes.TYPE: # TODO: can be further optimized + if a["element_id"] and b["element_id"]: + return a["element_id"] == b["element_id"] + elif a["element_role"] and b["element_role"]: + return ( + a["element_role"] == b["element_role"] + and a["element_name"] == b["element_name"] + ) + elif a["pw_code"] and b["pw_code"]: + return a["pw_code"] == b["pw_code"] + else: + return False + case ActionTypes.PAGE_FOCUS: + return a["page_number"] == b["page_number"] + case ActionTypes.NEW_TAB: + return True + case ActionTypes.GO_BACK: + return True + case ActionTypes.GO_FORWARD: + return True + case ActionTypes.GOTO_URL: + return a["url"] == b["url"] + case ActionTypes.PAGE_CLOSE: + return True + case ActionTypes.CHECK | ActionTypes.SELECT_OPTION: + return a["pw_code"] == b["pw_code"] + case ActionTypes.STOP: + return a["answer"] == b["answer"] + case _: + raise ValueError(f"Unknown action type: {a['action_type']}") + + +_key2id: dict[str, int] = { + key: i + for i, key in enumerate( + chain(SPECIAL_KEYS, ASCII_CHARSET, FREQ_UNICODE_CHARSET, ["\n"]) + ) +} +_id2key: list[str] = sorted(_key2id, key=_key2id.get) # type: ignore[arg-type] +_role2id: dict[RolesType, int] = { + cast(RolesType, role): i + for i, role in enumerate(chain(ROLES, SPECIAL_LOCATORS)) +} +_id2role: list[RolesType] = sorted(_role2id, key=_role2id.get) # type: ignore[arg-type] + + +def _keys2ids(keys: list[int | str] | str) -> list[int]: + return list( + map( + lambda key: _key2id[str(key)] + if isinstance(key, str) + else int(key), + keys, + ) + ) + + +@beartype +def get_action_space() -> spaces.Dict: + """Return the space of serialized actions.""" + space = spaces.Dict( + { + "action_type": spaces.Discrete(len(ActionTypes)), + # coords (left, top) is used for COORD_CLICK + "coords": spaces.Box( + np.array([0.0, 0.0], dtype=np.float32), + np.array([1.0, 1.0], dtype=np.float32), + ), + # element role is used for FOCUS_AND_CLICK and FOCUS_AND_TYPE + "element_role": spaces.Discrete( + len(ROLES) + len(SPECIAL_LOCATORS) + ), + # element name is used with element role + "element_name": spaces.Text(TEXT_MAX_LENGTH), + "element_id": spaces.Text(TEXT_MAX_LENGTH), + # text is only used for TYPE and FOCUS_AND_TYPE + "text": spaces.MultiDiscrete( + [ + len(ASCII_CHARSET) + + len(SPECIAL_KEYS) + + len(FREQ_UNICODE_CHARSET) + ] + * TYPING_MAX_LENGTH + ), + "page_number": spaces.Discrete(MAX_PAGE_NUMBER), + "url": spaces.Text(URL_MAX_LENGTH), + "nth": spaces.Discrete(MAX_ELEMENT_INDEX_IN_VIEWPORT), + "key_comb": spaces.Text(MAX_VANILLA_STR_LENGTH), + "direction": spaces.Text(MAX_VANILLA_STR_LENGTH), + "pw_code": spaces.Text(MAX_VANILLA_STR_LENGTH), + "answer": spaces.Text(MAX_ANSWER_LENGTH), + } + ) + return space + + +@beartype +def create_random_action() -> Action: + """Return a random action.""" + return { + "action_type": np.random.randint(len(ActionTypes)), + "coords": np.random.rand(2).astype(np.float32), + "element_role": np.random.randint(len(ROLES) + len(SPECIAL_LOCATORS)), + "element_name": "".join( + random.choices(ASCII_CHARSET, k=np.random.randint(TEXT_MAX_LENGTH)) + ), + "text": list( + random.choices( + list(range(len(ASCII_CHARSET))), + k=np.random.randint(TYPING_MAX_LENGTH), + ) + ), + "page_number": np.random.randint(MAX_PAGE_NUMBER), + "url": "".join( + random.choices(ASCII_CHARSET, k=np.random.randint(URL_MAX_LENGTH)) + ), + "nth": np.random.randint(MAX_ELEMENT_INDEX_IN_VIEWPORT), + "element_id": str(np.random.randint(MAX_ELEMENT_ID)), + "key_comb": "+".join( + random.choices(SPECIAL_KEYS, k=np.random.randint(3)) + ), + "direction": random.choice(["up", "down"]), + "pw_code": "".join( + random.choices( + string.ascii_uppercase + string.digits, + k=np.random.randint(MAX_VANILLA_STR_LENGTH), + ) + ), + "answer": str(np.random.randint(MAX_ANSWER_LENGTH)), + "raw_prediction": str(np.random.randint(MAX_ANSWER_LENGTH)), + } + + +@beartype +def create_none_action() -> Action: + """Return a valid action object that does nothing.""" + return { + "action_type": ActionTypes.NONE, + "coords": np.zeros(2, dtype=np.float32), + "element_role": 0, + "element_name": "", + "text": [], + "page_number": 0, + "url": "", + "nth": 0, + "pw_code": "", # str that requires further processing + "element_id": "", + "key_comb": "", + "direction": "", + "answer": "", + "raw_prediction": "", + "label": "", + "flag": False, + } + + +@beartype +def create_stop_action(answer: str="") -> Action: + action = create_none_action() + action.update({"action_type": ActionTypes.STOP, "answer": answer}) + return action + + +@beartype +def create_scroll_action(direction: str) -> Action: + """Return the playwright action""" + assert direction in ["up", "down"] + action = create_none_action() + action.update( + { + "action_type": ActionTypes.SCROLL, + "direction": direction, + } + ) + return action + + +@beartype +def create_mouse_hover_action( + left: float | None = None, top: float | None = None +) -> Action: + """Return a valid action object with type COORD_CLICK.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.MOUSE_HOVER, + "coords": np.array([left, top], dtype=np.float32), + } + ) + return action + + +@beartype +def create_key_press_action(key_comb: str) -> Action: + """Return the key press action""" + + def map_keys(key_comb: str) -> str: + keys = key_comb.split("+") + mapped_keys = [] + for key in keys: + mapped_key = SPECIAL_KEY_MAPPINGS.get(key.lower(), key) + mapped_keys.append(mapped_key) + return "+".join(mapped_keys) + + action = create_none_action() + mapped_key_comb = map_keys(key_comb) + action.update( + { + "action_type": ActionTypes.KEY_PRESS, + "key_comb": mapped_key_comb, + } + ) + return action + + +@beartype +def create_page_focus_action(page_number: int) -> Action: + """Return a valid action object with type PAGE_FOCUS.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.PAGE_FOCUS, + "page_number": page_number, + } + ) + return action + + +@beartype +def create_new_tab_action() -> Action: + """Return a valid action object with type NEW_TAB.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.NEW_TAB, + } + ) + return action + + +@beartype +def create_go_back_action() -> Action: + """Return a valid action object with type GO_BACK.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.GO_BACK, + } + ) + return action + + +@beartype +def create_go_forward_action() -> Action: + """Return a valid action object with type GO_FORWARD.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.GO_FORWARD, + } + ) + return action + + +@beartype +def create_goto_url_action(url: str) -> Action: + """Return a valid action object with type GOTO_URL.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.GOTO_URL, + "url": url, + } + ) + return action + +@beartype +def create_our_goto_url_action(url: str, flag: bool) -> Action: + """Return a valid action object with type GOTO_URL.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.GOTO_URL, + "flag": flag, + "url": url, + } + ) + return action + +@beartype +def create_page_close_action() -> Action: + """Return a valid action object with type PAGE_CLOSE.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.PAGE_CLOSE, + } + ) + return action + + +@beartype +def create_mouse_click_action( + left: float | None = None, top: float | None = None +) -> Action: + """Return a valid action object with type COORD_CLICK.""" + action = create_none_action() + if left and top: + action.update( + { + "action_type": ActionTypes.MOUSE_CLICK, + "coords": np.array([left, top], dtype=np.float32), + } + ) + elif (not left) and (not top): + action.update( + { + "action_type": ActionTypes.CLICK, + } + ) + else: + raise ValueError("left and top must be both None or both not None") + return action + + +@beartype +def create_keyboard_type_action(keys: list[int | str] | str) -> Action: + """Return a valid action object with type TYPE.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.KEYBOARD_TYPE, + "text": _keys2ids(keys), + } + ) + return action + + +@beartype +def create_click_action( + element_id: str = "", + element_role: RolesType = "link", + element_name: str = "", + pw_code: str = "", + nth: int = 0, +) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.CLICK, + "element_id": element_id, + "element_role": _role2id[element_role], + "element_name": element_name, + "nth": nth, + "pw_code": pw_code, + } + ) + return action + + +@beartype +def create_hover_action( + element_id: str = "", + element_role: RolesType = "link", + element_name: str = "", + pw_code: str = "", + nth: int = 0, +) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.HOVER, + "element_id": element_id, + "element_role": _role2id[element_role], + "element_name": element_name, + "nth": nth, + "pw_code": pw_code, + } + ) + return action + + +@beartype +def create_type_action( + text: str, + element_id: str = "", + element_role: RolesType = "link", + element_name: str = "", + pw_code: str = "", + nth: int = 0, +) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.TYPE, + "element_id": element_id, + "element_role": _role2id[element_role], + "element_name": element_name, + "nth": nth, + "text": _keys2ids(text), + "pw_code": pw_code, + } + ) + return action + +@beartype +def create_our_type_action( + text: str, + element_id: str = "", + element_role: RolesType = "link", + element_name: str = "", + pw_code: str = "", + nth: int = 0, + flag: bool = True, +) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.TYPE, + "element_id": element_id, + "element_role": _role2id[element_role], + "element_name": element_name, + "nth": nth, + "text": _keys2ids(text), + "pw_code": pw_code, + "flag": flag, + } + ) + return action + + +@beartype +def create_check_action(pw_code: str) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.CHECK, + "pw_code": pw_code, + } + ) + return action + +@beartype +def create_record_action(text: str) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.NONE, + "answer": f"#Record# {text}", + } + ) + return action + +def create_select_option_action( + pw_code: str, +) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.SELECT_OPTION, + "pw_code": pw_code, + } + ) + return action + +def create_our_select_option_action( + pw_code: str, + label: str, + text: str, +) -> Action: + action = create_none_action() + action.update( + { + "action_type": ActionTypes.SELECT_OPTION, + "pw_code": pw_code, + "label": label, + "option": text, + } + ) + return action + +@beartype +def create_focus_action( + element_role: RolesType, element_name: str = "", nth: int = 0 +) -> Action: + """Return a valid action object with type CLICK. + + Keep compatible with the old version.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.CLICK, + "element_role": _role2id[element_role], + "element_name": element_name, + "nth": nth, + } + ) + return action + + +@beartype +def create_focus_and_click_action( + element_role: RolesType, element_name: str = "", nth: int = 0 +) -> Action: + """Return a valid action object with type CLICK. + + Keep compatible with the old version.""" + + action = create_none_action() + action.update( + { + "action_type": ActionTypes.CLICK, + "element_role": _role2id[element_role], + "element_name": element_name, + "nth": nth, + } + ) + return action + + +@beartype +def create_focus_and_type_action( + keys: list[int | str] | str, + element_role: RolesType, + element_name: str = "", + nth: int = 0, +) -> Action: + """Return a valid action object with type TYPE. + + Keep compatible with the old version.""" + action = create_none_action() + action.update( + { + "action_type": ActionTypes.TYPE, + "element_role": _role2id[element_role], + "element_name": element_name, + "text": _keys2ids(keys), + "nth": nth, + } + ) + return action + + +def execute_scroll(direction: str, page: Page) -> None: + # perform the action + # code from natbot + if direction == "up": + page.evaluate( + "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop - window.innerHeight * 0.8;" + ) + elif direction == "down": + page.evaluate( + "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop + window.innerHeight * 0.8;" + ) + + +async def aexecute_scroll(direction: str, page: APage) -> None: + # perform the action + # code from natbot + if direction == "up": + await page.evaluate( + "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop - window.innerHeight;" + ) + elif direction == "down": + await page.evaluate( + "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop + window.innerHeight;" + ) + + +def execute_key_press(key: str, page: Page) -> None: + """Press a key.""" + if "Meta" in key and "Mac" not in page.evaluate("navigator.platform"): + key = key.replace("Meta", "Control") + page.keyboard.press(key) + + +async def aexecute_key_press(key: str, page: APage) -> None: + """Press a key.""" + if "Meta" in key and "Mac" not in await page.evaluate( + "navigator.platform" + ): + key = key.replace("Meta", "Control") + await page.keyboard.press(key) + + +def execute_mouse_hover(left: float, top: float, page: Page) -> None: + """Click at coordinates (left, top).""" + viewport_size = page.viewport_size + assert viewport_size + page.mouse.move( + left * viewport_size["width"], top * viewport_size["height"] + ) + + +async def aexecute_mouse_hover(left: float, top: float, page: APage) -> None: + """Click at coordinates (left, top).""" + viewport_size = page.viewport_size + assert viewport_size + await page.mouse.move( + left * viewport_size["width"], top * viewport_size["height"] + ) + + +def execute_mouse_click(left: float, top: float, page: Page) -> None: + """Click at coordinates (left, top).""" + viewport_size = page.viewport_size + assert viewport_size + page.mouse.click( + left * viewport_size["width"], top * viewport_size["height"] + ) + + +async def aexecute_mouse_click(left: float, top: float, page: APage) -> None: + """Click at coordinates (left, top).""" + viewport_size = page.viewport_size + assert viewport_size + await page.mouse.click( + left * viewport_size["width"], top * viewport_size["height"] + ) + + +def execute_keyboard_type(text: str, page: Page) -> None: + """Fill the focused element with text.""" + page.keyboard.type(text) + + +async def aexecute_keyboard_type(text: str, page: APage) -> None: + """Fill the focused element with text.""" + await page.keyboard.type(text) + + +def execute_click_current(page: Page) -> None: + """Click at the current mouse position.""" + locators = page.locator("*:focus") + if not locators.count(): + for frame in page.frames[1:]: + locators = frame.locator("*:focus") + if locators.count(): + break + locators.click() + + +async def aexecute_click_current(page: APage) -> None: + """Click at the current mouse position.""" + locators = page.locator("*:focus") + locator_count = await locators.count() + if not locator_count: + for frame in page.frames[1:]: + locators = frame.locator("*:focus") + locator_count = await locators.count() + if locator_count: + break + await locators.click() + await page.wait_for_load_state("load") + + +def execute_type(keys: list[int], page: Page) -> None: + """Send keystrokes to the focused element.""" + if _id2key[keys[-1]] == "\n": + text = "".join([_id2key[key] for key in keys[:-1]]) + page.keyboard.type(text) + time.sleep(1) + page.keyboard.press("Enter") + else: + text = "".join([_id2key[key] for key in keys]) + page.keyboard.type(text) + + +async def aexecute_type(keys: list[int], page: APage) -> None: + """Send keystrokes to the focused element.""" + text = "".join([_id2key[key] for key in keys]) + await page.keyboard.type(text) + + +def execute_focus( + element_role: int, element_name: str, nth: int, page: Page +) -> None: + """Click the specified DOM element.""" + element_role_str = _id2role[element_role] + if page.viewport_size is None: + raise ValueError("Viewport size is not set for the current page") + element_location_list: list[tuple[Locator, float, float]] = [] + for frame in page.frames: + match element_role_str: + case "alt_text": + locators = frame.get_by_alt_text(element_name) + case "label": + locators = frame.get_by_label(element_name) + case "placeholder": + locators = frame.get_by_placeholder(element_name) + case _: + locators = frame.get_by_role( + role=element_role_str, name=element_name + ) + for locator_idx in range(locators.count()): + locator = locators.nth(locator_idx) + if is_in_viewport(locator, page.viewport_size): + bounding_box = locator.bounding_box() + assert bounding_box + element_location_list.append( + (locator, bounding_box["x"], bounding_box["y"]) + ) + if len(element_location_list) <= nth: + raise ValueError( + f"There are only {len(element_location_list)} elements found in viewport, but {nth + 1} is requested" + ) + element_location_list.sort(key=lambda x: (x[2], x[1])) # row major order + element_location_list[nth][0].focus() + + +async def aexecute_focus( + element_role: int, element_name: str, nth: int, page: APage +) -> None: + """Click the specified DOM element.""" + element_role_str = _id2role[element_role] + if page.viewport_size is None: + raise ValueError("Viewport size is not set for the current page") + element_location_list: list[tuple[ALocator, float, float]] = [] + for frame in page.frames: + match element_role_str: + case "alt_text": + locators = frame.get_by_alt_text(element_name) + case "label": + locators = frame.get_by_label(element_name) + case "placeholder": + locators = frame.get_by_placeholder(element_name) + case _: + locators = frame.get_by_role( + role=element_role_str, name=element_name + ) + for locator_idx in range(await locators.count()): + locator = locators.nth(locator_idx) + if await async_is_in_viewport(locator, page.viewport_size): + bounding_box = await locator.bounding_box() + assert bounding_box + element_location_list.append( + (locator, bounding_box["x"], bounding_box["y"]) + ) + if len(element_location_list) <= nth: + raise ValueError( + f"There are only {len(element_location_list)} elements found in viewport, but {nth + 1} is requested" + ) + element_location_list.sort(key=lambda x: (x[2], x[1])) # row major order + await element_location_list[nth][0].focus() + + +def locate(locator_calls: list[ParsedPlaywrightCode], page: Page) -> Locator: + locator = page + for call in locator_calls: + function_name = call["function_name"] + arguments = call["arguments"] + keywords = call["keywords"] + locator = getattr(locator, function_name)(*arguments, **keywords) + return locator # type: ignore[return-value] + + +async def alocate( + locator_calls: list[ParsedPlaywrightCode], page: APage +) -> ALocator: + locator = page + for call in locator_calls: + function_name = call["function_name"] + arguments = call["arguments"] + keywords = call["keywords"] + locator = await getattr(locator, function_name)(*arguments, **keywords) + return locator # type: ignore[return-value] + + +def execute_playwright_click( + locator_code: list[ParsedPlaywrightCode], + page: Page, + pw_action_args: list[str] = [], + pw_action_kwargs: dict[str, Any] = {}, +) -> None: + locator = locate(locator_code, page) + + # perform the action + locator.click(*pw_action_args, **pw_action_kwargs) + + +async def aexecute_playwright_click( + locator_code: list[ParsedPlaywrightCode], + page: APage, + pw_action_args: list[str] = [], + pw_action_kwargs: dict[str, Any] = {}, +) -> None: + locator = await alocate(locator_code, page) + + # perform the action + await locator.click(*pw_action_args, **pw_action_kwargs) + + +def execute_playwright_hover( + locator_code: list[ParsedPlaywrightCode], page: Page +) -> None: + locator = locate(locator_code, page) + + # perform the action + locator.hover() + + +async def aexecute_playwright_hover( + locator_code: list[ParsedPlaywrightCode], page: APage +) -> None: + locator = await alocate(locator_code, page) + + # perform the action + await locator.hover() + + +def execute_playwright_type( + text: str, + locator_code: list[ParsedPlaywrightCode], + page: Page, + pw_action_args: list[str] = [], + pw_action_kwargs: dict[str, Any] = {}, +) -> None: + locator = locate(locator_code, page) + # perform the action + pw_action_args = [text] + pw_action_args # text is the first argument + locator.type(*pw_action_args, **pw_action_kwargs) + + +async def aexecute_playwright_type( + text: str, + locator_code: list[ParsedPlaywrightCode], + page: APage, + pw_action_args: list[str] = [], + pw_action_kwargs: dict[str, Any] = {}, +) -> None: + locator = await alocate(locator_code, page) + # perform the action + pw_action_args = [text] + pw_action_args # text is the first argument + await locator.type(*pw_action_args, **pw_action_kwargs) + + +def execute_playwright_select_option( + locator_code: list[ParsedPlaywrightCode], + page: Page, + pw_action_args: list[str] = [], + pw_action_kwargs: dict[str, Any] = {}, +) -> None: + locator = locate(locator_code, page) + # perform the action + locator.select_option(*pw_action_args, **pw_action_kwargs) + + +async def aexecute_playwright_select_option( + locator_code: list[ParsedPlaywrightCode], + page: APage, + pw_action_args: list[str] = [], + pw_action_kwargs: dict[str, Any] = {}, +) -> None: + locator = await alocate(locator_code, page) + # perform the action + await locator.select_option(*pw_action_args, **pw_action_kwargs) + + +def execute_playwright_check( + locator_code: list[ParsedPlaywrightCode], page: Page +) -> None: + locator = locate(locator_code, page) + # perform the action + locator.check() + + +async def aexecute_playwright_check( + locator_code: list[ParsedPlaywrightCode], page: APage +) -> None: + locator = await alocate(locator_code, page) + # perform the action + await locator.check() + + +def execute_action( + action: Action, + page: Page, + browser_ctx: BrowserContext, + obseration_processor: ObservationProcessor, +) -> Page: + """Execute the action on the ChromeDriver.""" + action_type = action["action_type"] + def is_at_bottom_of_page(page): + result = page.evaluate('(window.scrollY + window.innerHeight) >= document.documentElement.scrollHeight') + return result + def is_at_top_of_page(page): + result = page.evaluate('window.scrollY === 0') + return result + + if "element_id" in action.keys() and action["element_id"]: + element_id = action["element_id"] + node = obseration_processor.get_node_info_by_element_id(int(element_id)) + while not obseration_processor.element_is_visible(page, element_id) and not is_at_bottom_of_page(page): + execute_scroll("down", page) + while not obseration_processor.element_is_visible(page, element_id) and not is_at_top_of_page(page): + execute_scroll("up", page) + + match action_type: + case ActionTypes.NONE: + pass + + case ActionTypes.SCROLL: + direction = "up" if "up" in action["direction"] else "down" + execute_scroll(direction, page) + case ActionTypes.KEY_PRESS: + keys = action["key_comb"] + execute_key_press(keys, page) + + case ActionTypes.MOUSE_CLICK: + execute_mouse_click(action["coords"][0], action["coords"][1], page) + case ActionTypes.MOUSE_HOVER: + execute_mouse_hover(action["coords"][0], action["coords"][1], page) + case ActionTypes.KEYBOARD_TYPE: + execute_type(action["text"], page) + + case ActionTypes.CLICK: + # check each kind of locator in order + # TODO[shuyanzh]: order is temp now + if action["element_id"]: + node = obseration_processor.get_node_info_by_element_id(int(element_id)) + if node and (node.role=="menuitem" or node.role=="option"): + try: + page.get_by_role(node.role, name=node.name, exact=True).click() + except: + try: + page.get_by_role(node.role, name=node.name).click() + except: + try: + page.get_by_role(node.parent.role, name=node.parent.name, exact=True).select_option(node.name) + except: + page.get_by_role(node.parent.role, name=node.parent.name).select_option(node.name) + else: + try: + page.get_by_role(node.role, name=node.name, exact=True).click() + except Exception as e: + try: + page.get_by_role(node.role, name=node.name).click() + except Exception as e: + element_id = action["element_id"] + element_center = obseration_processor.get_element_center(element_id, page) # type: ignore[attr-defined] + execute_mouse_click(element_center[0], element_center[1], page) + elif action["element_role"] and action["element_name"]: + element_role = int(action["element_role"]) + element_name = action["element_name"] + nth = action["nth"] + execute_focus(element_role, element_name, nth, page) + execute_click_current(page) + elif action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + # [shuyanzh], don't support action args and kwargs now + execute_playwright_click(locator_code=locator_code, page=page) + else: + raise ValueError("No proper locator found for click action") + case ActionTypes.HOVER: + if action["element_id"]: + element_id = action["element_id"] + element_center = obseration_processor.get_element_center(element_id, page) # type: ignore[attr-defined] + execute_mouse_hover(element_center[0], element_center[1], page) + elif action["element_role"] and action["element_name"]: + element_role = int(action["element_role"]) + element_name = action["element_name"] + nth = action["nth"] + execute_focus(element_role, element_name, nth, page) + elif action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + # [shuyanzh], don't support action args and kwargs now + execute_playwright_hover(locator_code=locator_code, page=page) + else: + raise NotImplementedError( + "No proper locator found for hover action" + ) + case ActionTypes.TYPE: + if action["element_id"]: + if not obseration_processor.element_is_visible(page, element_id): + press_enter = True if _id2key[action["text"][-1]] == "\n" else False + node = obseration_processor.get_node_info_by_element_id(int(element_id)) + try: + if press_enter: + page.get_by_role(node.role, name=node.name, exact=True).fill("".join([_id2key[idx] for idx in action["text"][:-1]])) + time.sleep(1) + page.keyboard.press("Enter") + else: + page.get_by_role(node.role, name=node.name, exact=True).fill("".join([_id2key[idx] for idx in action["text"]])) + except: + if press_enter: + page.get_by_role(node.role, name=node.name).fill("".join([_id2key[idx] for idx in action["text"][:-1]])) + time.sleep(1) + page.keyboard.press("Enter") + else: + page.get_by_role(node.role, name=node.name).fill("".join([_id2key[idx] for idx in action["text"]])) + else: + element_id = action["element_id"] + element_center = obseration_processor.get_element_center(element_id, page) # type: ignore[attr-defined] + execute_mouse_click(element_center[0], element_center[1], page) + page.keyboard.press("Control+A") + for _ in range(1): + page.keyboard.press("Backspace") + execute_type(action["text"], page) + elif action["element_role"] and action["element_name"]: + element_role = int(action["element_role"]) + element_name = action["element_name"] + nth = action["nth"] + execute_focus(element_role, element_name, nth, page) + execute_type(action["text"], page) + elif action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + text = parsed_code[-1]["arguments"][0] + # [shuyanzh], don't support action args and kwargs now + execute_playwright_type( + text=text, locator_code=locator_code, page=page + ) + else: + raise NotImplementedError( + "No proper locator found for type action" + ) + + case ActionTypes.PAGE_FOCUS: + page = browser_ctx.pages[action["page_number"]] + page.bring_to_front() + case ActionTypes.NEW_TAB: + page = browser_ctx.new_page() + page.client = page.context.new_cdp_session(page) # type: ignore[attr-defined] + case ActionTypes.GO_BACK: + page.go_back() + if "about:blank" in page.url: + page.go_forward() + case ActionTypes.GO_FORWARD: + page.go_forward() + case ActionTypes.GOTO_URL: + if action["answer"] == "1": + page = browser_ctx.new_page() + page.client = page.context.new_cdp_session(page) + page.goto(action["url"]) + case ActionTypes.PAGE_CLOSE: + page.close() + if len(browser_ctx.pages) > 0: + page = browser_ctx.pages[-1] + else: + page = browser_ctx.new_page() + + case ActionTypes.SELECT_OPTION: + if action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + pw_action_args = parsed_code[-1].get('arguments', []) + execute_playwright_select_option(locator_code, page, pw_action_args) + else: + raise NotImplementedError( + "No proper locator found for select option action" + ) + case ActionTypes.CHECK: + if action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + execute_playwright_check(locator_code, page) + else: + raise NotImplementedError( + "No proper locator found for select option action" + ) + case ActionTypes.STOP: + pass + + case _: + raise ValueError(f"Unknown action type: {action_type}") + + return page + + +async def aexecute_action( + action: Action, page: APage, browser_ctx: ABrowserContext +) -> APage: + """Execute the async action on the ChromeDriver.""" + action_type = action["action_type"] + match action_type: + case ActionTypes.NONE: + pass + case ActionTypes.SCROLL: + direction = "up" if "up" in action["direction"] else "down" + await aexecute_scroll(direction, page) + case ActionTypes.KEY_PRESS: + keys = action["key_comb"] + await aexecute_key_press(keys, page) + + case ActionTypes.MOUSE_CLICK: + await aexecute_mouse_click( + action["coords"][0], action["coords"][1], page + ) + case ActionTypes.MOUSE_HOVER: + await aexecute_mouse_hover( + action["coords"][0], action["coords"][1], page + ) + case ActionTypes.KEYBOARD_TYPE: + await aexecute_type(action["text"], page) + + case ActionTypes.CLICK: + # check each kind of locator in order + # TODO[shuyanzh]: order is temp now + if action["element_id"]: + raise NotImplementedError + elif action["element_role"] and action["element_name"]: + element_role = int(action["element_role"]) + element_name = action["element_name"] + nth = action["nth"] + await aexecute_focus(element_role, element_name, nth, page) + await aexecute_click_current(page) + elif action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + # [shuyanzh], don't support action args and kwargs now + await aexecute_playwright_click( + locator_code=locator_code, page=page + ) + else: + raise ValueError("No proper locator found for click action") + case ActionTypes.HOVER: + if action["element_id"]: + raise NotImplementedError + elif action["element_role"] and action["element_name"]: + element_role = int(action["element_role"]) + element_name = action["element_name"] + nth = action["nth"] + await aexecute_focus(element_role, element_name, nth, page) + elif action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + # [shuyanzh], don't support action args and kwargs now + await aexecute_playwright_hover( + locator_code=locator_code, page=page + ) + else: + raise NotImplementedError( + "No proper locator found for hover action" + ) + case ActionTypes.TYPE: + if action["element_id"]: + raise NotImplementedError + elif action["element_role"] and action["element_name"]: + element_role = int(action["element_role"]) + element_name = action["element_name"] + nth = action["nth"] + await aexecute_focus(element_role, element_name, nth, page) + await aexecute_type(action["text"], page) + elif action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + text = parsed_code[-1]["arguments"][0] + # [shuyanzh], don't support action args and kwargs now + await aexecute_playwright_type( + text=text, locator_code=locator_code, page=page + ) + else: + raise NotImplementedError( + "No proper locator found for type action" + ) + + case ActionTypes.PAGE_FOCUS: + page = browser_ctx.pages[action["page_number"]] + await page.bring_to_front() + case ActionTypes.NEW_TAB: + page = await browser_ctx.new_page() + case ActionTypes.GO_BACK: + await page.go_back() + case ActionTypes.GO_FORWARD: + await page.go_forward() + case ActionTypes.GOTO_URL: + await page.goto(action["url"]) + case ActionTypes.PAGE_CLOSE: + await page.close() + if len(browser_ctx.pages) > 0: + page = browser_ctx.pages[-1] + else: + page = await browser_ctx.new_page() + + case ActionTypes.SELECT_OPTION: + if action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + await aexecute_playwright_select_option(locator_code, page) + else: + raise NotImplementedError( + "No proper locator found for select option action" + ) + case ActionTypes.CHECK: + if action["pw_code"]: + parsed_code = parse_playwright_code(action["pw_code"]) + locator_code = parsed_code[:-1] + await aexecute_playwright_check(locator_code, page) + else: + raise NotImplementedError( + "No proper locator found for select option action" + ) + + case _: + raise ValueError(f"Unknown action type: {action_type}") + + return page + + +def parse_playwright_code(code: str) -> list[ParsedPlaywrightCode]: + # extract function calls + if not code.startswith("page."): + raise ValueError( + f'Playwright action must start with "page.", but got {code}' + ) + + regex = r"\.(?![^\(\)]*\))" + chain = re.split(regex, code)[1:] + + parsed_chain = [] + + for item in chain: + tree = ast.parse(item) + funcs = [] + for node in ast.walk(tree): + if isinstance(node, ast.Call): + function_name = node.func.id # type: ignore[attr-defined] + arguments = [ + ast.literal_eval(arg) if isinstance(arg, ast.Str) else arg + for arg in node.args + ] + keywords = { + str(kw.arg): ast.literal_eval(kw.value) + for kw in node.keywords + } + funcs.append( + ParsedPlaywrightCode( + { + "function_name": function_name, + "arguments": arguments, + "keywords": keywords, + } + ) + ) + + if len(funcs) != 1: + raise ValueError(f"Fail to parse {item} in {code}") + + if ( + funcs[0]["function_name"] + not in PLAYWRIGHT_LOCATORS + PLAYWRIGHT_ACTIONS + ): + raise ValueError( + f"Invalid playwright code {item}, ", + f"the function needs to be one of {PLAYWRIGHT_LOCATORS + PLAYWRIGHT_ACTIONS}", + ) + + parsed_chain.append(funcs[0]) + + last_action = parsed_chain[-1] + if last_action["function_name"] not in PLAYWRIGHT_ACTIONS: + raise ValueError( + f"Invalid playwright action {last_action},", + f"the action needs to be one of {PLAYWRIGHT_ACTIONS}", + ) + + return parsed_chain + + +class ActionParsingError(Exception): + def __init__(self, message: str) -> None: + self.message = message + super().__init__(self.message) + + +@beartype +def create_playwright_action(playwright_code: str) -> Action: + """Main function to return individual playwright action""" + # get the last action + regex = r"\.(?![^\(\)]*\))" + action = re.split(regex, playwright_code)[-1].split("(")[0] + match action: + case "press": + p = r'press\((?:"|\')(.+?)(?:"|\')\)' + match = re.search(p, playwright_code) + if not match: + raise ActionParsingError( + f"Invalid press action, required to be page.press(KEY_COMB_STR)" + ) + key_comb = match.group(1) + return create_key_press_action(key_comb=key_comb) + case "scroll": + direction = "up" if "up" in playwright_code else "down" + return create_scroll_action(direction=direction) + case "click": + return create_click_action(pw_code=playwright_code) + case "hover": + return create_hover_action(pw_code=playwright_code) + case "type" | "fill": + p = r'type|fill\((?:"|\')(.+?)(?:"|\')\)' + match = re.search(p, playwright_code) + if not match: + raise ActionParsingError( + f"Invalid type/fill action, required to be page.type(TEXT)" + ) + text = match.group(1) + return create_type_action(text=text, pw_code=playwright_code) + case "select_option": + return create_select_option_action(pw_code=playwright_code) + case "check": + return create_check_action(pw_code=playwright_code) + case "goto": + p = r'goto\((?:"|\')(.+?)(?:"|\')\)' + match = re.search(p, playwright_code) + if not match: + raise ActionParsingError( + f"Invalid goto action, required to be page.goto(URL_STR)" + ) + url = match.group(1) + return create_goto_url_action(url) + case "page_focus": + # get the page number + p = r"page_focus\((\d+)\)" + match = re.search(p, playwright_code) + if not match: + raise ActionParsingError("page focus requires a page number") + page_num = int(match.group(1)) + return create_page_focus_action(page_num) + case "new_tab": + return create_new_tab_action() + case "go_back": + return create_go_back_action() + case "go_forward": + return create_go_forward_action() + case "page_close": + return create_page_close_action() + case "stop": # page.stop(answer) + p = r'stop\(?"(.+)?"\)' + match = re.search(p, playwright_code) + if not match: + answer = "" + else: + answer = match.group(1) + return create_stop_action(answer) + + raise ActionParsingError(f"Unknown playwright action {action}") + + +@beartype +def create_id_based_action(action_str: str): + """Main function to return individual id based action""" + action_str = action_str.strip() + action = ( + action_str.split("[")[0].strip() + if "[" in action_str + else action_str.split()[0].strip() + ) + match action: + case "click": + match = re.search(r"click ?\[(\d+)\]", action_str) + if not match: + raise ActionParsingError(f"Invalid click action {action_str}") + element_id = match.group(1) + return create_click_action(element_id=element_id) + case "hover": + match = re.search(r"hover ?\[(\d+)\]", action_str) + if not match: + raise ActionParsingError(f"Invalid hover action {action_str}") + element_id = match.group(1) + return create_hover_action(element_id=element_id) + case "type": + # add default enter flag + if not (action_str.endswith("[0]") or action_str.endswith("[1]")): + action_str += " [1]" + + match = re.search( + r"type ?\[(\d+)\] ?\[(.+)\] ?\[(\d+)\]", action_str + ) + if not match: + raise ActionParsingError(f"Invalid type action {action_str}") + element_id, text, enter_flag = ( + match.group(1), + match.group(2), + match.group(3), + ) + enter_flag = True if enter_flag == "1" else False + if enter_flag: + text += "\n" + return create_our_type_action(text=text, element_id=element_id, flag=enter_flag) + case "press": + match = re.search(r"press ?\[(.+)\]", action_str) + if not match: + raise ActionParsingError(f"Invalid press action {action_str}") + key_comb = match.group(1) + return create_key_press_action(key_comb=key_comb) + case "scroll": + # up or down + match = re.search(r"scroll ?\[?(up|down)\]?", action_str) + if not match: + raise ActionParsingError(f"Invalid scroll action {action_str}") + direction = match.group(1) + return create_scroll_action(direction=direction) + case "goto": + if not (action_str.endswith("[0]") or action_str.endswith("[1]")): + action_str += " [1]" + match = re.search(r"goto ?\[(.+)\] \[(\d+)\]", action_str) + if not match: + raise ActionParsingError(f"Invalid goto action {action_str}") + url, new_tab_flag = ( + match.group(1), + match.group(2), + ) + new_tab_flag = True if new_tab_flag == "1" else False + return create_our_goto_url_action(url=url, flag=new_tab_flag) + case "new_tab": + return create_new_tab_action() + case "go_back": + return create_go_back_action() + case "go_forward": + return create_go_forward_action() + case "tab_focus": + match = re.search(r"tab_focus ?\[(\d+)\]", action_str) + if not match: + raise ActionParsingError( + f"Invalid tab_focus action {action_str}" + ) + page_number = int(match.group(1)) + return create_page_focus_action(page_number) + case "close_tab": + return create_page_close_action() + case "stop": # stop answer + match = re.search(r"stop ?\[(.+)\]", action_str) + if not match: # some tasks don't require an answer + answer = "" + else: + answer = match.group(1) + return create_stop_action(answer) + case "select": + match = re.search(r"select ?\[(.+)\] ?\[(.+)\]", action_str) + if not match: + raise ActionParsingError(f"Invalid select action {action_str}") + elem = match.group(1) + option = match.group(2) + pw_code = f'page.get_by_test_id("{elem}").select_option("{option}")' + return create_our_select_option_action(pw_code, elem, option) + case "record": + match = re.search(r"record ?\[(.+)\]", action_str) + text = match.group(1) + return create_record_action(text) + + return False + +def create_id_based_actions(action_str: str): + valid_actions = ["click", "hover", "type", "press", "scroll", "goto", "new_tab", "go_back", "go_forward", "tab_focus", "close tab", "stop", "select", "record", "branch", "prune", "note"] + def parse_str_to_action_list(text:str, actions: list): + remain_text = text + action_list = [] + while remain_text: + find_action = False + for action in actions: + if remain_text.startswith(action): + match = re.search(rf'({re.escape(action)}\s*(.*?))(?=\n(?:{"|".join(map(re.escape, actions))})|$)', remain_text, re.DOTALL) + action_list.append(match[0]) + remain_text = remain_text[len(match[0]):].strip() + find_action = True + if not find_action: + break + return action_list + action_str_list = parse_str_to_action_list(action_str, valid_actions) + action_cmds = [] + for raw_action_str in action_str_list: + action = ( + raw_action_str.split("[")[0].strip() + if "[" in raw_action_str + else raw_action_str.split()[0].strip() + ) + match action: + case "click": + match = re.search(r"click ?\[(\d+)\]", raw_action_str) + if not match: + raise ActionParsingError(f"Invalid click action {raw_action_str}") + element_id = match.group(1) + action_cmds.append(create_click_action(element_id=element_id)) + case "hover": + match = re.search(r"hover ?\[(\d+)\]", raw_action_str) + if not match: + raise ActionParsingError(f"Invalid hover action {raw_action_str}") + element_id = match.group(1) + action_cmds.append(create_hover_action(element_id=element_id)) + case "type": + # add default enter flag + if not (raw_action_str.endswith("[0]") or raw_action_str.endswith("[1]")): + raw_action_str += " [1]" + + match = re.search( + r"type ?\[(\d+)\] ?\[(.*)\] ?\[(\d+)\]", raw_action_str, re.DOTALL + ) + if not match: + raise ActionParsingError(f"Invalid type action {raw_action_str}") + element_id, text, enter_flag = ( + match.group(1), + match.group(2), + match.group(3), + ) + enter_flag = True if enter_flag == "1" else False + if enter_flag: + text += "\n" + action_cmds.append(create_our_type_action(text=text, element_id=element_id, flag=enter_flag)) + case "press": + match = re.search(r"press ?\[(.+)\]", raw_action_str) + if not match: + raise ActionParsingError(f"Invalid press action {raw_action_str}") + key_comb = match.group(1) + action_cmds.append(create_key_press_action(key_comb=key_comb)) + case "scroll": + # up or down + match = re.search(r"scroll ?\[?(up|down)\]?", raw_action_str) + if not match: + raise ActionParsingError(f"Invalid scroll action {raw_action_str}") + direction = match.group(1) + action_cmds.append(create_scroll_action(direction=direction)) + case "goto": + if not (raw_action_str.endswith("[0]") or raw_action_str.endswith("[1]")): + raw_action_str += " [1]" + match = re.search(r"goto ?\[(.+)\] \[(\d+)\]", raw_action_str) + if not match: + raise ActionParsingError(f"Invalid goto action {raw_action_str}") + url, new_tab_flag = ( + match.group(1), + match.group(2), + ) + new_tab_flag = True if new_tab_flag == "1" else False + action_cmds.append(create_our_goto_url_action(url=url, flag=new_tab_flag)) + case "new_tab": + action_cmds.append(create_new_tab_action()) + case "go_back": + action_cmds.append(create_go_back_action()) + case "go_forward": + action_cmds.append(create_go_forward_action()) + case "tab_focus": + match = re.search(r"tab_focus ?\[(\d+)\]", raw_action_str) + if not match: + raise ActionParsingError( + f"Invalid tab_focus action {raw_action_str}" + ) + page_number = int(match.group(1)) + action_cmds.append(create_page_focus_action(page_number)) + case "close_tab": + action_cmds.append(create_page_close_action()) + case "stop": # stop answer + match = re.search(r"stop ?\[?(.+)\]?", raw_action_str, re.DOTALL) + if not match: # some tasks don't require an answer + answer = "" + else: + answer = match.group(1) + if answer.endswith("]"): + answer = answer[:-1] + action_cmds.append(create_stop_action(answer)) + case "select": + match = re.search(r"select ?\[(.+)\] ?\[(.+)\]", raw_action_str) + if not match: + raise ActionParsingError(f"Invalid select action {raw_action_str}") + elem = match.group(1) + option = match.group(2) + pw_code = f'page.get_by_test_id("{elem}").select_option("{option}")' + action_cmds.append(create_our_select_option_action(pw_code, elem, option)) + case "record": + match = re.search(r"record ?\[?(.+)\]?", raw_action_str, re.DOTALL) + text = match.group(1) + action_cmds.append(create_record_action(text)) + case "note": + pass + + return action_cmds \ No newline at end of file diff --git a/browser_env/async_envs.py b/browser_env/async_envs.py new file mode 100644 index 0000000..29fb32f --- /dev/null +++ b/browser_env/async_envs.py @@ -0,0 +1,153 @@ +import asyncio +import json +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import numpy.typing as npt +from gymnasium import Env +from gymnasium.spaces import Box, Text +from playwright.async_api import Page, ViewportSize, async_playwright + +from .actions import Action, aexecute_action, get_action_space +from .utils import DetachedPage, png_bytes_to_numpy + + +class AsyncScriptBrowserEnv(Env[npt.NDArray[np.uint8], Action]): + """ + The goal of this environment is to produce a prototype of a browser environment. + In the end, we want to support a fully configurable browser environment with wide + range of action spaces and observation spaces, both structured and unstructured. + But in this prototype, we just support action space specified by Playwright script, + and observation space is the html content of the page. + """ + + def __init__( + self, + max_page_length: int = 2048, + headless: bool = True, + slow_mo: int = 0, + timeout: int = 30000, + viewport_size: ViewportSize = {"width": 1280, "height": 720}, + ): + self.observation_space = Box( + 0, + 255, + (viewport_size["height"], viewport_size["width"], 4), + np.uint8, + ) + # TODO: make Space[Action] = ActionSpace + self.action_space = get_action_space() # type: ignore[assignment] + self.headless = headless + self.slow_mo = slow_mo + self.reset_finished = False + self.timeout = timeout + self.viewport_size = viewport_size + + async def setup(self, config_file: Path | None = None) -> None: + self.context_manager = async_playwright() + self.playwright = await self.context_manager.__aenter__() + self.browser = await self.playwright.chromium.launch( + headless=self.headless, slow_mo=self.slow_mo + ) + if config_file: + with open(config_file, "r") as f: + instance_config = json.load(f) + else: + instance_config = {} + + storage_state = instance_config.get("storage_state", None) + start_url = instance_config.get("start_url", None) + geolocation = instance_config.get("geolocation", None) + + self.context = await self.browser.new_context( + viewport=self.viewport_size, + storage_state=storage_state, + geolocation=geolocation, + device_scale_factor=1, + ) + self.page = await self.context.new_page() + if start_url: + await self.page.goto(start_url) + + async def areset( + self, + *, + seed: int | None = None, + options: dict[str, str] | None = None, + ) -> tuple[npt.NDArray[np.uint8], dict[str, object]]: + """ + Reset the environment. + :param options: options for the environment. The options are: + - storage_state: the path to the storage state file + """ + super().reset(seed=seed, options=options) + if self.reset_finished: + await self.context_manager.__aexit__() + if options is not None and "config_file" in options: + config_file = Path(options["config_file"]) + if config_file.exists(): + await self.setup(config_file=config_file) + else: + raise ValueError(f"Config state {config_file} does not exist.") + else: + await self.setup() + self.reset_finished = True + content = await self.page.content() + screenshot = png_bytes_to_numpy(await self.page.screenshot()) + return ( + screenshot, + {"page": DetachedPage(self.page.url, content)}, + ) + + def reset( + self, + *, + seed: int | None = None, + options: dict[str, str] | None = None, + ) -> tuple[npt.NDArray[np.uint8], dict[str, object]]: + return asyncio.run(self.areset(seed=seed, options=options)) + + async def aclose(self) -> None: + if self.reset_finished: + await self.context_manager.__aexit__() + + def close(self) -> None: + asyncio.run(self.aclose()) + + async def astep( + self, action: Action + ) -> tuple[npt.NDArray[np.uint8], float, bool, bool, dict[str, object]]: + if not self.reset_finished: + raise RuntimeError("Call reset first before calling step.") + success = False + fail_error = "" + try: + self.page = await aexecute_action(action, self.page, self.context) + success = True + except Exception as e: + fail_error = str(e) + + try: + content = await self.page.content() + screenshot = png_bytes_to_numpy(await self.page.screenshot()) + except: + await self.page.wait_for_load_state("load") + content = await self.page.content() + screenshot = png_bytes_to_numpy(await self.page.screenshot()) + + return ( + screenshot, + float(success), + False, + False, + { + "page": DetachedPage(self.page.url, content), + "fail_error": fail_error, + }, + ) + + def step( + self, action: Action + ) -> tuple[npt.NDArray[np.uint8], float, bool, bool, dict[str, object]]: + return asyncio.run(self.astep(action), debug=True) diff --git a/browser_env/auto_login.py b/browser_env/auto_login.py new file mode 100644 index 0000000..a54632d --- /dev/null +++ b/browser_env/auto_login.py @@ -0,0 +1,207 @@ +"""Script to automatically login each website""" +import argparse +import glob +import os +import time +from concurrent.futures import ThreadPoolExecutor +from itertools import combinations +from pathlib import Path + +from playwright.sync_api import sync_playwright + +import sys +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from browser_env.env_config import ( + ACCOUNTS, + GITLAB, + REDDIT, + SHOPPING, + SHOPPING_ADMIN, +) + +HEADLESS = True +SLOW_MO = 0 + + +SITES = ["gitlab", "shopping", "shopping_admin", "reddit"] +URLS = [ + f"{GITLAB}/-/profile", + f"{SHOPPING}/wishlist/", + f"{SHOPPING_ADMIN}/dashboard", + f"{REDDIT}/user/{ACCOUNTS['reddit']['username']}/account", +] +EXACT_MATCH = [True, True, True, True] +KEYWORDS = ["", "", "Dashboard", "Delete"] + + +def is_expired( + storage_state: Path, url: str, keyword: str, url_exact: bool = True +) -> bool: + """Test whether the cookie is expired""" + if not storage_state.exists(): + return True + + context_manager = sync_playwright() + playwright = context_manager.__enter__() + browser = playwright.chromium.launch(headless=True, slow_mo=SLOW_MO) + context = browser.new_context(storage_state=storage_state) + page = context.new_page() + page.goto(url) + time.sleep(1) + d_url = page.url + content = page.content() + context_manager.__exit__() + if keyword: + return keyword not in content + else: + if url_exact: + return d_url != url + else: + return url not in d_url + + +def renew_comb(comb: list[str], auth_folder: str = "./.auth") -> None: + for c in comb: + context_manager = sync_playwright() + playwright = context_manager.__enter__() + browser = playwright.chromium.launch(headless=HEADLESS) + context = browser.new_context() + page = context.new_page() + + if c == "shopping": + username = ACCOUNTS["shopping"]["username"] + password = ACCOUNTS["shopping"]["password"] + page.goto(f"{SHOPPING}/customer/account/login/") + page.get_by_label("Email", exact=True).fill(username) + page.get_by_label("Password", exact=True).fill(password) + page.get_by_role("button", name="Sign In").click() + + if c == "reddit": + username = ACCOUNTS["reddit"]["username"] + password = ACCOUNTS["reddit"]["password"] + page.goto(f"{REDDIT}/login") + page.get_by_label("Username").fill(username) + page.get_by_label("Password").fill(password) + page.get_by_role("button", name="Log in").click() + + if c == "shopping_admin": + username = ACCOUNTS["shopping_admin"]["username"] + password = ACCOUNTS["shopping_admin"]["password"] + page.goto(f"{SHOPPING_ADMIN}") + page.get_by_placeholder("user name").fill(username) + page.get_by_placeholder("password").fill(password) + page.get_by_role("button", name="Sign in").click() + + if c == "gitlab": + username = ACCOUNTS["gitlab"]["username"] + password = ACCOUNTS["gitlab"]["password"] + page.goto(f"{GITLAB}/users/sign_in") + page.screenshot(path="debug.png") + page.get_by_test_id("username-field").click() + page.get_by_test_id("username-field").fill(username) + page.get_by_test_id("username-field").press("Tab") + page.get_by_test_id("password-field").fill(password) + page.get_by_test_id("sign-in-button").click() + + context.storage_state(path=f"{auth_folder}/{c}_state.json") + + context_manager.__exit__() + context_manager = sync_playwright() + playwright = context_manager.__enter__() + browser = playwright.chromium.launch(headless=HEADLESS) + context = browser.new_context() + page = context.new_page() + + if "shopping" in comb: + username = ACCOUNTS["shopping"]["username"] + password = ACCOUNTS["shopping"]["password"] + page.goto(f"{SHOPPING}/customer/account/login/") + page.get_by_label("Email", exact=True).fill(username) + page.get_by_label("Password", exact=True).fill(password) + page.get_by_role("button", name="Sign In").click() + + if "reddit" in comb: + username = ACCOUNTS["reddit"]["username"] + password = ACCOUNTS["reddit"]["password"] + page.goto(f"{REDDIT}/login") + page.get_by_label("Username").fill(username) + page.get_by_label("Password").fill(password) + page.get_by_role("button", name="Log in").click() + + if "shopping_admin" in comb: + username = ACCOUNTS["shopping_admin"]["username"] + password = ACCOUNTS["shopping_admin"]["password"] + page.goto(f"{SHOPPING_ADMIN}") + page.get_by_placeholder("user name").fill(username) + page.get_by_placeholder("password").fill(password) + page.get_by_role("button", name="Sign in").click() + + if "gitlab" in comb: + username = ACCOUNTS["gitlab"]["username"] + password = ACCOUNTS["gitlab"]["password"] + page.goto(f"{GITLAB}/users/sign_in") + page.get_by_test_id("username-field").click() + page.get_by_test_id("username-field").fill(username) + page.get_by_test_id("username-field").press("Tab") + page.get_by_test_id("password-field").fill(password) + page.get_by_test_id("sign-in-button").click() + + context.storage_state(path=f"{auth_folder}/{'.'.join(comb)}_state.json") + + context_manager.__exit__() + + +def get_site_comb_from_filepath(file_path: str) -> list[str]: + comb = os.path.basename(file_path).rsplit("_", 1)[0].split(".") + return comb + + +def main(auth_folder: str = "./.auth") -> None: + pairs = list(combinations(SITES, 2)) + + max_workers = 8 + with ThreadPoolExecutor(max_workers=max_workers) as executor: + for pair in pairs: + # TODO[shuyanzh] auth don't work on these two sites + if "reddit" in pair and ( + "shopping" in pair or "shopping_admin" in pair + ): + continue + executor.submit( + renew_comb, list(sorted(pair)), auth_folder=auth_folder + ) + + for site in SITES: + executor.submit(renew_comb, [site], auth_folder=auth_folder) + + futures = [] + cookie_files = list(glob.glob(f"{auth_folder}/*.json")) + with ThreadPoolExecutor(max_workers=max_workers) as executor: + for c_file in cookie_files: + comb = get_site_comb_from_filepath(c_file) + for cur_site in comb: + url = URLS[SITES.index(cur_site)] + keyword = KEYWORDS[SITES.index(cur_site)] + match = EXACT_MATCH[SITES.index(cur_site)] + future = executor.submit( + is_expired, Path(c_file), url, keyword, match + ) + futures.append(future) + + for i, future in enumerate(futures): + assert not future.result(), f"Cookie {cookie_files[i]} expired." + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--site_list", nargs="+", default=["all"]) + parser.add_argument("--auth_folder", type=str, default="./.auth") + args = parser.parse_args() + if not args.site_list: + main() + else: + if "all" in args.site_list: + main(auth_folder=args.auth_folder) + else: + renew_comb(args.site_list, auth_folder=args.auth_folder) diff --git a/browser_env/constants.py b/browser_env/constants.py new file mode 100644 index 0000000..1276112 --- /dev/null +++ b/browser_env/constants.py @@ -0,0 +1,295 @@ +from typing import Literal + +ROLES = ( + "alert", + "alertdialog", + "application", + "article", + "banner", + "blockquote", + "button", + "caption", + "cell", + "checkbox", + "code", + "columnheader", + "combobox", + "complementary", + "contentinfo", + "definition", + "deletion", + "dialog", + "directory", + "document", + "emphasis", + "feed", + "figure", + "form", + "generic", + "grid", + "gridcell", + "group", + "heading", + "img", + "insertion", + "link", + "list", + "listbox", + "listitem", + "log", + "main", + "marquee", + "math", + "meter", + "menu", + "menubar", + "menuitem", + "menuitemcheckbox", + "menuitemradio", + "navigation", + "none", + "note", + "option", + "paragraph", + "presentation", + "progressbar", + "radio", + "radiogroup", + "region", + "row", + "rowgroup", + "rowheader", + "scrollbar", + "search", + "searchbox", + "separator", + "slider", + "spinbutton", + "status", + "strong", + "subscript", + "superscript", + "switch", + "tab", + "table", + "tablist", + "tabpanel", + "term", + "textbox", + "time", + "timer", + "toolbar", + "tooltip", + "tree", + "treegrid", + "treeitem", +) + +SPECIAL_LOCATORS = ( + "alt_text", + "label", + "placeholder", +) + +ASCII_CHARSET = "".join(chr(x) for x in range(32, 128)) +FREQ_UNICODE_CHARSET = "".join(chr(x) for x in range(129, 110000)) +UTTERANCE_MAX_LENGTH = 8192 +ATTRIBUTE_MAX_LENGTH = 256 +TEXT_MAX_LENGTH = 256 +TYPING_MAX_LENGTH = 64 +URL_MAX_LENGTH = 256 +MAX_ELEMENT_INDEX_IN_VIEWPORT = 10 +MAX_ELEMENT_ID = 1000 +MAX_ANSWER_LENGTH = 512 + +MIN_REF = -1000000 +MAX_REF = 1000000 + +WINDOW_WIDTH = 500 +WINDOW_HEIGHT = 240 +TASK_WIDTH = 160 +TASK_HEIGHT = 210 + +FLIGHT_WINDOW_WIDTH = 600 +FLIGHT_WINDOW_HEIGHT = 700 +FLIGHT_TASK_WIDTH = 375 +FLIGHT_TASK_HEIGHT = 667 +MAX_PAGE_NUMBER = 10 + +SPECIAL_KEYS = ( + "Enter", + "Tab", + "Control", + "Shift", + "Meta", + "Backspace", + "Delete", + "Escape", + "ArrowUp", + "ArrowDown", + "ArrowLeft", + "ArrowRight", + "PageDown", + "PageUp", + "Meta+a", +) + +SPECIAL_KEY_MAPPINGS = { + "backquote": "Backquote", + "minus": "Minus", + "equal": "Equal", + "backslash": "Backslash", + "backspace": "Backspace", + "meta": "Meta", + "tab": "Tab", + "delete": "Delete", + "escape": "Escape", + "arrowdown": "ArrowDown", + "end": "End", + "enter": "Enter", + "home": "Home", + "insert": "Insert", + "pagedown": "PageDown", + "pageup": "PageUp", + "arrowright": "ArrowRight", + "arrowup": "ArrowUp", + "f1": "F1", + "f2": "F2", + "f3": "F3", + "f4": "F4", + "f5": "F5", + "f6": "F6", + "f7": "F7", + "f8": "F8", + "f9": "F9", + "f10": "F10", + "f11": "F11", + "f12": "F12", +} + +RolesType = Literal[ + "alert", + "alertdialog", + "application", + "article", + "banner", + "blockquote", + "button", + "caption", + "cell", + "checkbox", + "code", + "columnheader", + "combobox", + "complementary", + "contentinfo", + "definition", + "deletion", + "dialog", + "directory", + "document", + "emphasis", + "feed", + "figure", + "form", + "generic", + "grid", + "gridcell", + "group", + "heading", + "img", + "insertion", + "link", + "list", + "listbox", + "listitem", + "log", + "main", + "marquee", + "math", + "meter", + "menu", + "menubar", + "menuitem", + "menuitemcheckbox", + "menuitemradio", + "navigation", + "none", + "note", + "option", + "paragraph", + "presentation", + "progressbar", + "radio", + "radiogroup", + "region", + "row", + "rowgroup", + "rowheader", + "scrollbar", + "search", + "searchbox", + "separator", + "slider", + "spinbutton", + "status", + "strong", + "subscript", + "superscript", + "switch", + "tab", + "table", + "tablist", + "tabpanel", + "term", + "textbox", + "time", + "timer", + "toolbar", + "tooltip", + "tree", + "treegrid", + "treeitem", + "alt_text", + "label", + "placeholder", +] + +MAX_VANILLA_STR_LENGTH = 1000 + +PLAYWRIGHT_LOCATORS = ( + "get_by_role", + "get_by_text", + "get_by_label", + "get_by_placeholder", + "get_by_alt_text", + "get_by_title", + "get_by_test_id", + "filter", + "frame_locator", + "locator", +) + +PLAYWRIGHT_ACTIONS = ( + "fill", + "check", + "select_option", + "click", + "hover", + "dclick", + "type", + "focus", + "goto", + "press", + "scroll", +) + +IGNORED_ACTREE_PROPERTIES = ( + "focusable", + "editable", + "readonly", + "level", + "settable", + "multiline", + "invalid", +) diff --git a/browser_env/env_config.py b/browser_env/env_config.py new file mode 100644 index 0000000..f57f304 --- /dev/null +++ b/browser_env/env_config.py @@ -0,0 +1,51 @@ +# websites domain +import os + +REDDIT = os.environ.get("REDDIT", "http://localhost:9999") +SHOPPING = os.environ.get("SHOPPING", "http://localhost:7770") +SHOPPING_ADMIN = os.environ.get("SHOPPING_ADMIN", "http://localhost:7780/admin") +GITLAB = os.environ.get("GITLAB", "http://localhost:8023") +WIKIPEDIA = os.environ.get("WIKIPEDIA", "http://localhost:8888/wikipedia_en_all_maxi_2022-05/A/User:The_other_Kiwix_guy/Landing") +MAP = os.environ.get("MAP", "http://localhost:3000") +HOMEPAGE = os.environ.get("HOMEPAGE", "http://localhost:4399") + +assert ( + REDDIT + and SHOPPING + and SHOPPING_ADMIN + and GITLAB + and WIKIPEDIA + and MAP + and HOMEPAGE +), ( + f"Please setup the URLs to each site. Current: \n" + + f"Reddit: {REDDIT}\n" + + f"Shopping: {SHOPPING}\n" + + f"Shopping Admin: {SHOPPING_ADMIN}\n" + + f"Gitlab: {GITLAB}\n" + + f"Wikipedia: {WIKIPEDIA}\n" + + f"Map: {MAP}\n" + + f"Homepage: {HOMEPAGE}\n" +) + + +ACCOUNTS = { + "reddit": {"username": "MarvelsGrantMan136", "password": "test1234"}, + "gitlab": {"username": "byteblaze", "password": "hello1234"}, + "shopping": { + "username": "emma.lopez@gmail.com", + "password": "Password.123", + }, + "shopping_admin": {"username": "admin", "password": "admin1234"}, + "shopping_site_admin": {"username": "admin", "password": "admin1234"}, +} + +URL_MAPPINGS = { + REDDIT: "http://reddit.com", + SHOPPING: "http://onestopmarket.com", + SHOPPING_ADMIN: "http://luma.com/admin", + GITLAB: "http://gitlab.com", + WIKIPEDIA: "http://wikipedia.org", + MAP: "http://openstreetmap.org", + HOMEPAGE: "http://homepage.com", +} diff --git a/browser_env/envs.py b/browser_env/envs.py new file mode 100644 index 0000000..336ca0f --- /dev/null +++ b/browser_env/envs.py @@ -0,0 +1,334 @@ +import json +import re +import time +from collections import defaultdict +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Union + +import numpy as np +import numpy.typing as npt +from beartype import beartype +from beartype.door import is_bearable +from gymnasium import Env +from gymnasium.spaces import Box, Text +from playwright.sync_api import ( + CDPSession, + Page, + Playwright, + ViewportSize, + expect, + sync_playwright, +) + +from .actions import Action, execute_action, get_action_space +from .processors import ObservationHandler, ObservationMetadata +from .utils import ( + AccessibilityTree, + DetachedPage, + Observation, + png_bytes_to_numpy, +) + +import base64 +from .scripts import * + +@dataclass +class PlaywrightScript: + function: str # goto, get_by_role + destination: str # https://www.google.com/, combobox + name: str | None = None # Search, Avatar 2009 + operation: str | None = None # click, fill, press + value: str | None = None # avatar movie, Enter + + +def parse_action(action: str) -> PlaywrightScript: + splitted = action.strip().split(" ") + assert len(splitted) >= 2 + match splitted[:2]: + case ["goto", url]: + assert len(splitted) == 2 + return PlaywrightScript("goto", url) + case ["get_by_role", destination]: + assert len(splitted) >= 4 + match splitted[2:]: + case [name, operation]: + return PlaywrightScript( + "get_by_role", destination, name, operation + ) + case [name, operation, value]: + return PlaywrightScript( + "get_by_role", destination, name, operation, value + ) + case _: + raise ValueError("Invalid action") + case _: + raise ValueError(f"Invalid action {action}") + + +class ScriptBrowserEnv(Env[dict[str, Observation], Action]): + """ + The goal of this environment is to produce a prototype of a browser environment. + In the end, we want to support a fully configurable browser environment with wide + range of action spaces and observation spaces, both structured and unstructured. + But in this prototype, we just support action space specified by Playwright script, + and observation space is the html content of the page. + """ + + @beartype + def __init__( + self, + max_page_length: int = 8192, + headless: bool = True, + slow_mo: int = 0, + observation_type: str = "html", + current_viewport_only: bool = False, + viewport_size: ViewportSize = {"width": 1280, "height": 720}, + save_trace_enabled: bool = False, + sleep_after_execution: float = 5.0, + global_config = None, + ): + # TODO: make Space[Action] = ActionSpace + self.action_space = get_action_space() # type: ignore[assignment] + self.headless = headless + self.slow_mo = slow_mo + self.current_viewport_only = current_viewport_only + self.reset_finished = False + self.viewport_size = viewport_size + self.save_trace_enabled = save_trace_enabled + self.sleep_after_execution = sleep_after_execution + self.global_config = global_config + + match observation_type: + case "html" | "accessibility_tree": + self.text_observation_type = observation_type + self.image_observation_type = "" + self.main_observation_type = "text" + case "image": + self.image_observation_type = observation_type + self.text_observation_type = "" # type: ignore[assignment] + self.main_observation_type = "image" + case _: + raise ValueError( + f"Unsupported observation type: {observation_type}" + ) + + self.observation_handler = ObservationHandler( + self.main_observation_type, + self.text_observation_type, + self.image_observation_type, + self.current_viewport_only, + self.viewport_size, + ) + + self.observation_space = ( + self.observation_handler.get_observation_space() + ) + + @beartype + def setup(self, config_file: Path | None = None) -> None: + def handle_dialog(dialog): + self.page.dialog_message = dialog.message + dialog.dismiss() + self.context_manager = sync_playwright() + self.playwright = self.context_manager.__enter__() + self.browser = self.playwright.chromium.launch( + headless=self.headless, slow_mo=self.slow_mo + ) + + if config_file: + with open(config_file, "r") as f: + instance_config = json.load(f) + else: + instance_config = {} + + storage_state = instance_config.get("storage_state", None) + start_url = instance_config.get("start_url", None) + geolocation = instance_config.get("geolocation", None) + + self.context = self.browser.new_context( + viewport=self.viewport_size, + storage_state=storage_state, + geolocation=geolocation, + device_scale_factor=1, + ) + if self.save_trace_enabled: + self.context.tracing.start(screenshots=True, snapshots=True) + if start_url: + start_urls = start_url.split(" |AND| ") + for url in start_urls: + page = self.context.new_page() + page.on("dialog", handle_dialog) + client = page.context.new_cdp_session( + page + ) # talk to chrome devtools + if self.text_observation_type == "accessibility_tree": + client.send("Accessibility.enable") + page.client = client # type: ignore # TODO[shuyanzh], fix this hackey client + page.goto(url) + # set the first page as the current page + self.page = self.context.pages[0] + self.page.bring_to_front() + else: + self.page = self.context.new_page() + page.on("dialog", handle_dialog) + client = self.page.context.new_cdp_session(self.page) + if self.text_observation_type == "accessibility_tree": + client.send("Accessibility.enable") + self.page.client = client # type: ignore + + def get_page_client(self, page: Page) -> CDPSession: + return page.client # type: ignore + + def _get_obs(self) -> dict[str, Observation]: + obs = self.observation_handler.get_observation( + self.page, self.get_page_client(self.page) + ) + return obs + + def _get_obs_metadata(self) -> dict[str, ObservationMetadata]: + metadata = self.observation_handler.get_observation_metadata() + return metadata + + @beartype + def reset( + self, + *, + seed: int | None = None, + options: dict[str, str] | None = None, + ) -> tuple[dict[str, Observation], dict[str, Any]]: + """ + Reset the environment. + :param options: options for the environment. The current supported options are: + - "storage_state": the storage state of the browser. It is a file path to a json file. + """ + super().reset(seed=seed, options=options) + if self.reset_finished: + self.context_manager.__exit__() + + if options is not None and "config_file" in options: + config_file = Path(options["config_file"]) + if config_file.exists(): + self.setup(config_file=config_file) + else: + raise ValueError(f"Config file {config_file} does not exist.") + else: + self.setup() + self.reset_finished = True + + if self.sleep_after_execution > 0: + time.sleep(self.sleep_after_execution) + + images = self.modify_page() + + observation = self._get_obs() + observation_metadata = self._get_obs_metadata() + info = { + "page": DetachedPage(self.page.url, ""), + "fail_error": "", + "observation_metadata": observation_metadata, + "images": images, + } + + return (observation, info) + + def save_trace(self, trace_path: str | Path) -> None: + if self.save_trace_enabled: + self.context.tracing.stop(path=trace_path) + + def close(self) -> None: + if self.reset_finished: + self.context_manager.__exit__() + + def step( + self, action: Action + ) -> tuple[dict[str, Observation], float, bool, bool, dict[str, Any]]: + if not self.reset_finished: + raise RuntimeError("Call reset first before calling step.") + + success = False + fail_error = "" + try: + self.page = execute_action( + action, + self.page, + self.context, + self.observation_handler.action_processor, + ) + success = True + except Exception as e: + fail_error = str(e) + raise e + + # hard sleep TODO[shuyanzh] suboptimal, may need to check network + if self.sleep_after_execution > 0: + time.sleep(self.sleep_after_execution) + + images = self.modify_page() + + observation = self._get_obs() + observation_metadata = self._get_obs_metadata() + + info = { + "page": DetachedPage(self.page.url, self.page.content()), + "fail_error": fail_error, + "observation_metadata": observation_metadata, + "images": images, + } + + msg = ( + observation, + float(success), # reward + False, # terminated + False, # truncated + info, + ) + return msg + + def modify_page(self): + self.page.wait_for_timeout(500) + try: + self.page.evaluate(remove_id_script) + except: + pass + + suffix = getattr(self.global_config, "logname", "") + if suffix: + img_bytes = self.page.screenshot(path=f"output/screenshot-{suffix}.png", full_page=True) + else: + img_bytes = self.page.screenshot(path="output/screenshot_raw.png") + raw_image = base64.b64encode(img_bytes).decode() + + self.page.evaluate(mix_marker_script) + self.page.wait_for_timeout(100) + + # get all clickable elements + start_id = 0 + elem_items, start_id = self.page.evaluate(get_rect_script, { + "selector": ".possible-clickable-element", + "startIndex": start_id + }) + + # get ocr items + ocr_items = [] + # ocr_items = page.evaluate(canva_handler_script) + # svg_items, _ = page.evaluate(get_rect_script, {"selector": "svg", "startIndex": -1}) + # ocr_items = ocr_items + svg_items + # ocr_items, start_id = get_canva_images(ocr_items, img_bytes, start_id) + + items = elem_items + ocr_items + + # mark our own labels and get the images + items = self.page.evaluate(label_marker_script, items) + if suffix: + img_bytes = self.page.screenshot(path=f"output/marked-{suffix}.png", full_page=True) + else: + img_bytes = self.page.screenshot(path="output/marked.png") + marked_image = base64.b64encode(img_bytes).decode() + + self.page.evaluate(remove_label_mark_script) + + return { + "raw_image": raw_image, + "marked_image": marked_image, + } \ No newline at end of file diff --git a/browser_env/helper_functions.py b/browser_env/helper_functions.py new file mode 100644 index 0000000..18521ab --- /dev/null +++ b/browser_env/helper_functions.py @@ -0,0 +1,307 @@ +import base64 +import io +import json +import re +from pathlib import Path +from typing import Any + +from PIL import Image + +from agent.prompts import * +from browser_env import ( + Action, + ActionTypes, + ObservationMetadata, + StateInfo, + action2str, +) + +HTML_TEMPLATE = """ + + + + + + + {body} + + +""" + + +def get_render_action( + action: Action, + observation_metadata: dict[str, ObservationMetadata], + action_set_tag: str, +) -> str: + """Parse the predicted actions for rendering purpose. More comprehensive information""" + match action_set_tag: + case "id_html_tree": + text_meta_data = observation_metadata["text"] + if action["element_id"] in text_meta_data["obs_nodes_info"]: + node_content = text_meta_data["obs_nodes_info"][ + action["element_id"] + ]["text"] + else: + node_content = "No match found" + + action_str = f"
{action['raw_prediction']}
" + action_str += f"
{repr(action)}
" + action_str += f"
{action2str(action, action_set_tag, node_content)}
" + + case "id_html_nasc_tree": + text_meta_data = observation_metadata["text"] + if action["element_id"] in text_meta_data["obs_nodes_info"]: + node_content = text_meta_data["obs_nodes_info"][ + action["element_id"] + ]["text"] + else: + node_content = "No match found" + + action_str = f"
{action['raw_prediction']}
" + action_str += f"
{repr(action)}
" + action_str += f"
{action2str(action, action_set_tag, node_content)}
" + + case "id_accessibility_tree": + text_meta_data = observation_metadata["text"] + if action["element_id"] in text_meta_data["obs_nodes_info"]: + node_content = text_meta_data["obs_nodes_info"][ + action["element_id"] + ]["text"] + else: + node_content = "No match found" + + action_str = f"
{action['raw_prediction']}
" + action_str += f"
{repr(action)}
" + action_str += f"
{action2str(action, action_set_tag, node_content)}
" + + case "playwright": + action_str = action["pw_code"] + case _: + raise ValueError(f"Unknown action type {action['action_type']}") + return action_str + + +def get_action_description( + action: Action, + observation_metadata: dict[str, ObservationMetadata], + action_set_tag: str, + prompt_constructor: PromptConstructor | None, +) -> str: + """Generate the text version of the predicted actions to store in action history for prompt use. + May contain hint information to recover from the failures""" + + match action_set_tag: + case "id_html_tree": + # old_op_prompt = "Website: %s; Thinking process: %s; Html segment: %s; Operation: %s; Result: %s" + op_prompt = "Html segment: %s; Operation: %s;" + text_meta_data = observation_metadata["text"] + node_info = text_meta_data["obs_nodes_info"] + result = 'Operation Success' + + if action["action_type"] in [ + ActionTypes.CLICK, + ActionTypes.HOVER, + ActionTypes.TYPE, + ]: + action_name = str(action["action_type"]).split(".")[1].lower() + if action["element_id"] in node_info: + node_content = node_info[action["element_id"]]["text"] + node_content = " ".join(node_content.split()[1:]) + action["label"] = node_info[action["element_id"]]["label"] + action_str = action2str( + action, action_set_tag, node_content + ) + else: + action_str = "None" + result = f"Cannot find the corresponding tag. Attempt to perfom \"{action_name}\" on element \"[{action['element_id']}]\" but no matching element found. Please check the observation more carefully." + else: + if ( + action["action_type"] == ActionTypes.NONE + and prompt_constructor is not None + ): + text = action["answer"] + if text is not None and text.count("#Record#") > 0: + action_str = text + else: + action_str = "None" + result = f'Operation invalid. The format was incorrect. Ensure that the action is wrapped inside a pair of # and seperate arguments within spaces as follows: #action# arg1 arg2 ....' + else: + action_str = action2str(action, action_set_tag, "") + + # action_str = op_prompt % ( + # prompt_constructor.state["url"], + # prompt_constructor.state["intention"], + # prompt_constructor.state["segment"], + # action_str, + # result, + # ) + + action_str = op_prompt % ( + prompt_constructor.state["segment"], + action_str, + ) + case "id_html_nasc_tree": + op_prompt = "%s #HTML Segment: %s" + text_meta_data = observation_metadata["text"] + node_info = text_meta_data["obs_nodes_info"] + result = 'Operation Success' + + if action["action_type"] in [ + ActionTypes.CLICK, + ActionTypes.HOVER, + ActionTypes.TYPE, + ]: + action_name = str(action["action_type"]).split(".")[1].lower() + if action["element_id"] in node_info: + node_content = node_info[action["element_id"]]["text"] + node_content = " ".join(node_content.split()[1:]) + action["label"] = node_info[action["element_id"]]["label"] + action_str = action2str( + action, action_set_tag, node_content + ) + else: + action_str = "None" + result = f"Cannot find the corresponding tag. Attempt to perfom \"{action_name}\" on element \"[{action['element_id']}]\" but no matching element found. Please check the observation more carefully." + else: + if ( + action["action_type"] == ActionTypes.NONE + and prompt_constructor is not None + ): + text = action["answer"] + if text is not None and text.count("record") > 0: + action_str = text + else: + action_str = "None" + result = f'Operation invalid. The format was incorrect. Ensure that the action is wrapped inside a pair of # and seperate arguments within spaces as follows: #action# arg1 arg2 ....' + else: + action_str = action2str(action, action_set_tag, "") + + action_str = op_prompt % ( + action_str, + prompt_constructor.state["segment"], + ) + + case "id_accessibility_tree": + text_meta_data = observation_metadata["text"] + if action["action_type"] in [ + ActionTypes.CLICK, + ActionTypes.HOVER, + ActionTypes.TYPE, + ]: + action_name = str(action["action_type"]).split(".")[1].lower() + if action["element_id"] in text_meta_data["obs_nodes_info"]: + node_content = text_meta_data["obs_nodes_info"][ + action["element_id"] + ]["text"] + node_content = " ".join(node_content.split()[1:]) + action_str = action2str( + action, action_set_tag, node_content + ) + else: + action_str = f"Attempt to perfom \"{action_name}\" on element \"[{action['element_id']}]\" but no matching element found. Please check the observation more carefully." + else: + if ( + action["action_type"] == ActionTypes.NONE + and prompt_constructor is not None + ): + action_splitter = prompt_constructor.instruction[ + "meta_data" + ]["action_splitter"] + action_str = f'The previous prediction you issued was "{action["raw_prediction"]}". However, the format was incorrect. Ensure that the action is wrapped inside a pair of {action_splitter} and enclose arguments within [] as follows: {action_splitter}action [arg] ...{action_splitter}.' + else: + action_str = action2str(action, action_set_tag, "") + + case "playwright": + action_str = action["pw_code"] + + case _: + raise ValueError(f"Unknown action type {action['action_type']}") + + return action_str + + +class RenderHelper(object): + """Helper class to render text and image observations and meta data in the trajectory""" + + def __init__( + self, config_file: str, result_dir: str, action_set_tag: str + ) -> None: + with open(config_file, "r") as f: + _config = json.load(f) + _config_str = "" + for k, v in _config.items(): + _config_str += f"{k}: {v}\n" + _config_str = f"
{_config_str}
\n" + task_id = _config["task_id"] + + self.action_set_tag = action_set_tag + + self.render_file = open( + Path(result_dir) / f"render_{task_id}.html", "a+" + ) + self.render_file.truncate(0) + # write init template + self.render_file.write(HTML_TEMPLATE.format(body=f"{_config_str}")) + self.render_file.read() + self.render_file.flush() + + def render( + self, + action: Action, + state_info: StateInfo, + meta_data: dict[str, Any], + render_screenshot: bool = False, + ) -> None: + """Render the trajectory""" + # text observation + observation = state_info["observation"] + text_obs = observation["text"] + info = state_info["info"] + new_content = f"

New Page

\n" + new_content += f"

URL: {state_info['info']['page'].url}

\n" + new_content += f"
{text_obs}
\n" + + if render_screenshot: + # image observation + img_obs = observation["image"] + image = Image.fromarray(img_obs) + byte_io = io.BytesIO() + image.save(byte_io, format="PNG") + byte_io.seek(0) + image_bytes = base64.b64encode(byte_io.read()) + image_str = image_bytes.decode("utf-8") + new_content += f"\n" + + # meta data + new_content += f"
{meta_data['action_history'][-1]}
\n" + + # action + action_str = get_render_action( + action, + info["observation_metadata"], + action_set_tag=self.action_set_tag, + ) + # with yellow background + action_str = f"
{action_str}
" + new_content += f"{action_str}\n" + + # add new content + self.render_file.seek(0) + html = self.render_file.read() + html_body = re.findall(r"(.*?)", html, re.DOTALL)[0] + html_body += new_content + + html = HTML_TEMPLATE.format(body=html_body) + self.render_file.seek(0) + self.render_file.truncate() + self.render_file.write(html) + self.render_file.flush() + + def close(self) -> None: + self.render_file.close() diff --git a/browser_env/html_tools/__init__.py b/browser_env/html_tools/__init__.py new file mode 100644 index 0000000..5e76c66 --- /dev/null +++ b/browser_env/html_tools/__init__.py @@ -0,0 +1,6 @@ +from .identifier import IdentifierTool +from .prompt import HtmlPrompt +from .html_parser import HtmlParser + +from .utils import print_html_object +from .configs import basic_attrs, mind2web_keep_attrs \ No newline at end of file diff --git a/browser_env/html_tools/configs/__init__.py b/browser_env/html_tools/configs/__init__.py new file mode 100644 index 0000000..b900a67 --- /dev/null +++ b/browser_env/html_tools/configs/__init__.py @@ -0,0 +1,3 @@ +from .html_prompt import prompts +from .config import basic_attrs, mind2web_keep_attrs, miniwob_attrs +from .config import config_meta \ No newline at end of file diff --git a/browser_env/html_tools/configs/config.py b/browser_env/html_tools/configs/config.py new file mode 100644 index 0000000..a979364 --- /dev/null +++ b/browser_env/html_tools/configs/config.py @@ -0,0 +1,49 @@ +basic_attrs = [ + 'title', + 'value', + 'placeholder', + 'selected', +] + +mind2web_keep_attrs = [ + 'alt', + 'aria_description', + 'aria_label', + 'aria_role', + 'input_checked', + 'input_value', + 'label', + 'name', + 'option_selected', + 'placeholder', + 'role', + 'text_value', + 'title', + 'type', + 'value', +] + +miniwob_attrs = [ + 'id', + 'type', + 'value', +] + +config_meta = """ +======= Configs ======= +Columns: + - id: {id_attr} + - label: {label_attr} +Position: {use_position} + - window: {window_size} + - rect_dict: {rect} +Keep: + - parents: {parent_chain} + - attrs: {keep_attrs} + - elems: {keep_elem} + - obs_elem: {obs_elem} +Generator: + - prompt: {prompt_name} + - label: {identifier_name} +======================== +""" \ No newline at end of file diff --git a/browser_env/html_tools/configs/html_prompt.py b/browser_env/html_tools/configs/html_prompt.py new file mode 100644 index 0000000..904d021 --- /dev/null +++ b/browser_env/html_tools/configs/html_prompt.py @@ -0,0 +1,22 @@ +refine_prompt = { + 'dom': '<{tag}{label}|{attr}{content}{subtree} >', + 'label': '[{label}]', + 'attr': '{attr}', + 'attr_splitter': '; ', + 'subtree_splitter': ' ', +} + +xml_prompt = { + 'dom': '<{tag}{label}{attr}>{content}{subtree} ', + 'label': ' id="{label}"', + 'attr': '{key}="{attr}"', + 'attr_splitter': ' ', + 'subtree_splitter': ' ', +} + +prompts = { + 'refine': refine_prompt, + 'xml': xml_prompt, + 'new_data': refine_prompt, +} + \ No newline at end of file diff --git a/browser_env/html_tools/html_parser.py b/browser_env/html_tools/html_parser.py new file mode 100644 index 0000000..7b173ce --- /dev/null +++ b/browser_env/html_tools/html_parser.py @@ -0,0 +1,426 @@ +from lxml import html +import time, copy, random +import json, re, os + +from .identifier import IdentifierTool +from .prompt import HtmlPrompt +from .configs import config_meta +from .utils import get_xpath_top_down, rect2tuple + +class HtmlParser(): + def __init__(self, ctx: str, args: dict[str]={}) -> None: + stt = time.time() + self.dom_tree = self.ctx2tree(ctx) + # tool related + self.bids2label = {} + self.bids2xpath = {} + self.used_labels = {} + + # parse args + self.parse_args(args) + self.init_time = time.time() - stt + + def parse_args(self, args: dict[str]={}) -> None: + def attr_check(attr, type_model='str'): + if attr is None: + return False + attr_type = type(attr) + if attr_type != type(type_model): + return False + if attr_type == type('str') and len(attr) == 0: + return False + return True + + args = {} if args is None else args + + # [Position] use_pos: False -> use full page, otherwise use window_size + dataset = args.get('dataset', '') + use_position = args.get('use_position', False) + window_size = args.get('window_size', None) + rect = args.get('rect_dict', None) + if use_position: + if not attr_check(window_size, ()): + raise ValueError('window_size must be set when use_position is True') + if not attr_check(rect, {}): + raise ValueError('rect_dict must be set when use_position is True') + + if not attr_check(rect, {}): + rect = {} + + # [Label] for vimium is temp_clickable_label, otherwise keep all of it + label_attr = args.get('label_attr', '') + get_new_label = args.get('regenerate_label', False) + label_method = args.get('label_generator', None) + regen_label = not attr_check(label_method) + + # [id] for mind2web is backend_node_id, for normal website use our method + id_attr = args.get('id_attr', '') + regen_id = not attr_check(id_attr) + + if regen_id: + id_attr = 'temp_id' + + # [attributes] + keep_attrs = args.get('attr_list', []) + if not attr_check(keep_attrs, []): + keep_attrs = [] + + # [Tags] for clickable elem, keep: must keep, obs: keep if follow specific rule + parent_chain = args.get('parent_chain', False) + keep_elem = args.get('keep_elem', []) + obs_elem = args.get('obs_elem', []) + + # sanity check + self.set_args(use_position, window_size, rect, label_attr, id_attr, keep_attrs, keep_elem, obs_elem, parent_chain, get_new_label, dataset) + + # [Prompt] + prompt = args.get('prompt', None) + self.prompt = HtmlPrompt(prompt) + + # traverse and get special data + if regen_id or regen_label: + self.mark_id() + + if get_new_label: + self.used_labels = {} + + self.identifier = IdentifierTool(label_method, self.used_labels) + + def set_args(self, use_position: bool=False, window_size: tuple=(), rect_dict: dict[str]={}, label_attr: str='', + id_attr: str='', keep_attrs: list[str]=[], keep_elem: list[str]=[], obs_elem: list[str]=[], + parent_chain: bool=False, get_new_label: bool=False, dataset: str='') -> None: + + self.use_position = use_position + self.window_size = window_size + self.rect = rect_dict + self.label_attr = label_attr + self.id_attr = id_attr + self.keep_attrs = keep_attrs + self.keep = keep_elem + self.obs = obs_elem + self.parent_chain = parent_chain + self.get_new_label = get_new_label + self.dataset = dataset + + def get_config(self): + config = { + 'id_attr': self.id_attr, + 'keep_attrs': self.keep_attrs[:5], + 'label_attr': self.label_attr, + 'use_position': self.use_position, + 'window_size': self.window_size, + 'rect': dict(list(self.rect.items())[:3]), + 'keep_elem': self.keep[:5], + 'obs_elem': self.obs[:5], + 'parent_chain': self.parent_chain, + 'prompt_name': self.prompt.name, + 'identifier_name': self.identifier.name + } + + return config, config_meta.format(**config) + + def update_rect_dict(self, rect_dict: dict[str]={}) -> None: + self.rect = rect_dict + + @staticmethod + def ctx2tree(ctx: str) -> html.HtmlElement: + # remove useless tags, eg. style and script + ctx = re.sub('', '', ctx) + ctx = re.sub('[\W\w]*?', '', ctx) + ctx = re.sub('[\W\w]*?', '', ctx) + ctx = '' if ctx is None else re.sub(r'\s+', ' ', ctx).strip() + dom_tree = html.fromstring(ctx) + return dom_tree + + @staticmethod + def get_root(tree: html.HtmlElement) -> html.HtmlElement: + node = tree.xpath('//*')[0] + while True: + parent = node.getparent() + if parent is None: + break + node = parent + return node + + def get_node_by_bid(self, tree: html.HtmlElement, bid: str) -> html.HtmlElement: + nodes = tree.xpath(f'//*[@{self.id_attr}="{bid}"]') + if len(nodes) == 0: + return None + return nodes[0] + + def id_label_converter(self, label: str) -> str: + return self.bids2label.get(label, '') + + def id_xpath_converter(self, label: str) -> str: + return self.bids2xpath.get(label, '') + + def mark_id(self) -> None: + root = self.get_root(self.dom_tree) + _, i2xpath, used_labels = get_xpath_top_down(root, self.id_attr, self.label_attr) + self.used_labels = used_labels + self.bids2xpath = i2xpath + + def parse(self, root: html.HtmlElement, keep: list[str], obs: list[str], parent_chain: bool=False, get_new_label: bool=False) -> dict[str]: + def get_text(str: str) -> str: + return '' if str is None else str.strip()[:500] + + def check_attr(attr: str, node: html.HtmlElement) -> bool: + tag = node.tag + if ( + ( attr == 'role' and node.attrib.get(attr, '') in ['presentation', 'none', 'link'] ) + or ( attr == 'type' and node.attrib.get(attr, '') == 'hidden' ) + # or ( attr == 'value' and tag in ['option'] ) + ): + return False + return True + + def is_visible(node: html.HtmlElement, bid: str) -> bool: + if self.dataset == 'mind2web': + bound = node.attrib.get('bounding_box_rect', None) + self.rect[bid] = rect2tuple(bound) + + if not self.use_position: + return True + + rect = self.rect.get(bid, None) + if rect is None: + return False + + if self.window_size is None: + return True + + # get window size + wx, wy, ww, wh = self.window_size + x, y, w, h = rect + if x + w < wx or x > wx + ww or y + h < wy or y > wy + wh: + return False + + return True + + def _dfs(node: html.HtmlElement, keep: list[str]=[], obs: list[str]=[], + parent_chain: bool=False, get_new_label: bool=False, par_keep: bool=False) -> (str, dict[str]): + # basic information + bid = node.attrib.get(self.id_attr, '') + tag = node.tag + label = node.attrib.get(self.label_attr, '') + + # element which is keeped equivalent to visible + visible = is_visible(node, bid) + in_keep_list = bid in keep + in_obs_list = (bid in obs or len(label) > 0) and visible + keep_element = in_keep_list or in_obs_list or visible or par_keep + + # mark label + bids2label, labeled_elems = {}, [] + have_label = False + if in_keep_list or in_obs_list: + if label is None or len(label) == 0 or get_new_label: + label = self.identifier.generate() + node.attrib[self.label_attr] = label + bids2label[bid] = label + bids2label[label] = bid + have_label = True + + # get text or alt_text of current element + text = get_text(node.text) + + classes = {} + # keep attributes if needed + keep_all_attrs = len(self.keep_attrs) == 0 + keep_attrs = node.attrib.keys() if keep_all_attrs else self.keep_attrs + + # traverse attributes + for attr in keep_attrs: + if attr not in node.attrib or not check_attr(attr, node): + continue + if attr in [self.id_attr, self.label_attr]: + continue + val = get_text(node.attrib[attr]) + if len(val) > 0 or keep_all_attrs: + classes[attr] = val + + have_text = len(text) > 0 or len(classes) > 0 + + parts = [] + clickable_count = 0 + children = node.getchildren() + for child in children: + cres, cmsg = _dfs(child, keep, obs, parent_chain, get_new_label) + clickable_count += 1 if cmsg.get('have_clickable', False) else 0 + bids2label.update(cmsg.get('bids2label', {})) + labeled_elems.extend(cmsg.get('label_element', [])) + if len(cres) != 0: + parts.append(cres) + + dom = self.prompt.subtree_constructor(parts) + + # remove if all children are text + keep_as_all_text = (dom.count('<') == dom.count(' 0 + if keep_as_all_text: + matches = re.findall(r']+) >', dom) + dom = self.prompt.subtree_constructor(matches) + + keep_element = keep_element and (clickable_count > 1 or have_text or have_label or keep_as_all_text) + keep_as_parent = len(dom) > 0 and parent_chain + if in_keep_list or keep_element or keep_as_parent: + dom = self.prompt.prompt_constructor(tag, label, text, dom, classes) + + if have_label: + labeled_elems.append(bid) + + control_msg = { + 'have_clickable': bool(clickable_count or have_text), + 'bids2label': bids2label, + 'label_element': labeled_elems, + } + + return dom, control_msg + + dom, cmsg = _dfs(root, keep, obs, parent_chain, get_new_label) + return dom, cmsg + + def parse_tree(self) -> dict[str]: + # start from here + stt = time.time() + root = self.get_root(self.dom_tree) + dom, cmsg = self.parse(root, self.keep, self.obs, self.parent_chain, self.get_new_label) + self.bids2label = cmsg.get('bids2label', {}) + self.keep = list(set(self.keep + cmsg.get('label_element', []))) + + obj = { + 'html': dom, + 'parse_time': time.time() - stt + } + + return obj + + # From mind2web, https://github.com/OSU-NLP-Group/Mind2Web/blob/main/src/data_utils/dom_utils.py + def get_keep_elements(self, tree: html.HtmlElement, keep: list[str], max_depth: int, max_children: int, + max_sibling: int, dfs_count: int=1, keep_parent: bool=False) -> list[str]: + def get_anscendants(node: html.HtmlElement, max_depth: int, current_depth: int=0) -> list[str]: + if current_depth > max_depth: + return [] + + anscendants = [] + parent = node.getparent() + if parent is not None: + anscendants.append(parent) + anscendants.extend(get_anscendants(parent, max_depth, current_depth + 1)) + + return anscendants + + def get_descendants(node: html.HtmlElement, max_depth: int, current_depth: int=0) -> list[str]: + if current_depth > max_depth: + return [] + + descendants = [] + for child in node: + descendants.append(child) + descendants.extend(get_descendants(child, max_depth, current_depth + 1)) + + return descendants + + to_keep = set(copy.deepcopy(keep)) + nodes_to_keep = set() + + for _ in range(max(1, dfs_count)): + for bid in to_keep: + candidate_node = self.get_node_by_bid(tree, bid) + if candidate_node is None: + continue + + nodes_to_keep.add(candidate_node.attrib[self.id_attr]) + # get all ancestors or with max depth + nodes_to_keep.update([x.attrib.get(self.id_attr, '') for x in get_anscendants(candidate_node, max_depth)]) + + # get descendants with max depth + nodes_to_keep.update([x.attrib.get(self.id_attr, '') for x in get_descendants(candidate_node, max_depth)][:max_children]) + # get siblings within range + parent = candidate_node.getparent() + if parent is None: + continue + + siblings = [x for x in parent.getchildren() if x.tag != 'text'] + if candidate_node not in siblings: + continue + + idx_in_sibling = siblings.index(candidate_node) + nodes_to_keep.update([x.attrib.get(self.id_attr, '') + for x in siblings[max(0, idx_in_sibling - max_sibling) : idx_in_sibling + max_sibling + 1]]) + + max_children = int(max_children * 0.5) + max_depth = int(max_depth * 0.5) + max_sibling = int(max_sibling * 0.7) + + to_keep = copy.deepcopy(nodes_to_keep) + + if keep_parent: + for bid in keep: + candidate_node = self.get_node_by_bid(tree, bid) + if candidate_node is None: + continue + nodes_to_keep.update([x.attrib.get(self.id_attr, '') for x in candidate_node.xpath("ancestor::*")]) + + return list(nodes_to_keep) + + def prune(self, tree: html.HtmlElement, nodes_to_keep: list[str]) -> html.HtmlElement: + # remove nodes not in nodes_to_keep + for node in tree.xpath('//*')[::-1]: + if node.tag != 'text': + is_keep = node.attrib.get(self.id_attr, '') in nodes_to_keep + is_candidate = node.attrib.get(self.id_attr, '') in self.keep + else: + is_keep = (node.getparent().attrib.get(self.id_attr, '') in nodes_to_keep) + is_candidate = (node.getparent().attrib.get(self.id_attr, '') in self.keep) + + if not is_keep and node.getparent() is not None: + # insert all children into parent + for child in node.getchildren(): + node.addprevious(child) + node.getparent().remove(node) + else: + # if not is_candidate or node.tag == 'text': + # node.attrib.pop(self.id_attr, None) + if ( + len(node.attrib) == 0 + and not any([x.tag == 'text' for x in node.getchildren()]) + and node.getparent() is not None + and node.tag != "text" + and len(node.getchildren()) <= 1 + ): + # insert all children into parent + for child in node.getchildren(): + node.addprevious(child) + node.getparent().remove(node) + + return tree + + def prune_tree(self, dfs_count: int=1, max_depth: int=3, max_children: int=30, + max_sibling: int=3, keep_parent: bool=False) -> None: + # clone the tree + new_tree = copy.deepcopy(self.dom_tree) + nodes_to_keep = self.get_keep_elements(new_tree, self.keep, max_depth, max_children, max_sibling, dfs_count, keep_parent) + new_tree = self.prune(new_tree, nodes_to_keep) + + self.dom_tree = new_tree + + def get_segment(self, bid: str) -> str: + # clone the tree + new_tree = copy.deepcopy(self.dom_tree) + nodes_to_keep = self.get_keep_elements(new_tree, [bid], 0, 2, 1) + new_tree = self.prune(new_tree, nodes_to_keep) + dom, _ = self.parse(new_tree, self.keep, [], False) + return dom + + def get_rect_data(self, bids: list[str]) -> list[dict[str]]: + res = [] + for bid in bids: + label = self.bids2label.get(bid, '') + rect = self.rect.get(bid, None) + res.append({ + 'bid': bid, + 'label': label, + 'rect': rect + }) + return res + \ No newline at end of file diff --git a/browser_env/html_tools/identifier.py b/browser_env/html_tools/identifier.py new file mode 100644 index 0000000..793ebed --- /dev/null +++ b/browser_env/html_tools/identifier.py @@ -0,0 +1,64 @@ +import secrets + +class IdentifierTool: + def __init__(self, method: str='order', existing_labels: dict[str]={}) -> None: + self.methods = { + 'order': self.get_identifier_in_order, + 'random': self.get_random_identifier, + } + + if method is None: + method = 'order' + + self.func = self.methods.get(method, None) + self.name = method + if self.func is None: + raise ValueError(f'Invalid method for identifier: {method}') + + self.reset(existing_labels) + + def reset(self, exists: dict[str]={}) -> None: + self.identifier = -1 + self.exists = {} if exists is None else exists + + def get_identifier_in_order(self) -> str: + def id2str(id: int) -> str: + if id < 26: + return chr(id + 65) + id -= 26 + c0 = id // 676 + c1 = (id // 26) % 26 + c2 = id % 26 + label = f'{chr(c1 + 65)}{chr(c2 + 65)}' + return label if c0 == 0 else f'{chr(c0 + 64)}{label}' + + self.identifier += 1 + label = id2str(self.identifier) + + while label in self.exists: + self.identifier += 1 + label = id2str(self.identifier) + + self.exists[label] = True + return label + + def get_random_identifier(self) -> str: + secret_generator = secrets.SystemRandom() + + def get_random_label(n: int=2) -> str: + tmp = '' + for _ in range(n): + tmp += chr(secret_generator.randint(65, 90)) + return tmp + + wc = 3 if len(self.exists) > 280 else 2 + + label = get_random_label(wc) + while label in self.exists: + label = get_random_label(wc) + + self.exists[label] = True + return label + + def generate(self): + return self.func() \ No newline at end of file diff --git a/browser_env/html_tools/prompt.py b/browser_env/html_tools/prompt.py new file mode 100644 index 0000000..38d6b94 --- /dev/null +++ b/browser_env/html_tools/prompt.py @@ -0,0 +1,97 @@ +from .configs import prompts + +class HtmlPrompt: + def __init__(self, prompt: str='') -> None: + prompt = self.extract(prompt, 'xml') + if prompt not in prompts: + raise Exception('Unknown prompt: ' + prompt) + + constructors = { + 'refine': self.normal_prompt_constructor, + 'xml': self.normal_prompt_constructor, + 'new_data': self.new_data_prompt_constructor, + } + + self.name = prompt + self.prompt = prompts[prompt] + self.constructor = constructors[prompt] + + @staticmethod + def extract(data, default=''): + return data if data is not None else default + + def subtree_constructor(self, subtree: list[str]=[]) -> str: + return self.prompt['subtree_splitter'].join(subtree) + + def normal_prompt_constructor(self, tag: str='', label: str='', content: str='', subtree_str: str='', class_dict: dict[str]={}) -> str: + def add_prefix(data, prefix): + return prefix + data if len(data) > 0 else '' + + tag = self.extract(tag) + label = self.extract(label) + content = self.extract(content) + subtree_str = self.extract(subtree_str, '') + class_dict = self.extract(class_dict, {}) + + label_str = '' + if len(label) > 0: + label_str = self.prompt['label'].format(label=label) + + classes = [] + values = set() + for key, val in class_dict.items(): + if val in values: + continue + values.add(val) + classes.append(self.prompt['attr'].format(key=key, attr=val)) + classes_str = self.prompt['attr_splitter'].join(classes) + + content_splitter = ' ' if len(classes_str) == 0 else self.prompt['attr_splitter'] + classes_str = add_prefix(classes_str, ' ') + content_str = add_prefix(content, content_splitter) + subtree_str = add_prefix(subtree_str, ' ') + + return self.prompt['dom'].format(tag=tag, label=label_str, attr=classes_str, content=content_str, subtree=subtree_str) + + def new_data_prompt_constructor(self, tag: str='', label: str='', content: str='', subtree_str: str='', class_dict: dict[str]={}) -> str: + def add_prefix(data, prefix): + return prefix + data if len(data) > 0 else '' + + tag = self.extract(tag) + label = self.extract(label) + content = self.extract(content) + subtree_str = self.extract(subtree_str, '') + class_dict = self.extract(class_dict, {}) + + label_str = '' + if len(label) > 0: + label_str = self.prompt['label'].format(label=label) + + classes = [] + values = set() + + message = [] + for key, val in class_dict.items(): + if val == '': + message.append(key) + continue + if val in values: + continue + values.add(val) + classes.append(self.prompt['attr'].format(key=key, attr=val)) + + if len(message) > 0: + message_str = ' '.join(message) + classes.append(self.prompt['attr'].format(key='message', attr=message_str)) + + classes_str = self.prompt['attr_splitter'].join(classes) + + content_splitter = ' ' if len(classes_str) == 0 else self.prompt['attr_splitter'] + classes_str = add_prefix(classes_str, ' ') + content_str = add_prefix(content, content_splitter) + subtree_str = add_prefix(subtree_str, ' ') + + return self.prompt['dom'].format(tag=tag, label=label_str, attr=classes_str, content=content_str, subtree=subtree_str) + + def prompt_constructor(self, tag: str='', label: str='', content: str='', subtree_str: str='', class_dict: dict[str]={}) -> str: + return self.constructor(tag, label, content, subtree_str, class_dict) \ No newline at end of file diff --git a/browser_env/html_tools/utils.py b/browser_env/html_tools/utils.py new file mode 100644 index 0000000..c3c71fb --- /dev/null +++ b/browser_env/html_tools/utils.py @@ -0,0 +1,101 @@ +from lxml import html +def get_xpath_top_down(element: html.HtmlElement, id_column: str='temp_id', label_column: str='temp_clickable_label', path: str='', order: int=0, + in_svg: bool=False, temp_id: int=0) -> tuple[int, dict[str, str], dict[str]]: + used_labels, i2xpath = {}, {} + # path + tag = element.tag.lower() + in_svg = in_svg or (tag == 'svg') + + if not in_svg and 'id' in element.attrib: + node_id = element.attrib['id'] + path = f'//*[@id="{node_id}"]' + else: + suffix = f'[{order}]' if order > 0 else '' + prefix = f'*[name()="{tag}"]' if in_svg else tag + path = path + '/' + prefix + suffix + + # add temp id + element.attrib[id_column] = str(temp_id) + ori_label = element.attrib.get(label_column, '') + if ori_label != '': + used_labels[ori_label] = True + + bid = str(temp_id) + i2xpath[bid] = path + i2xpath[path] = bid + i2xpath[f'xpath/{path}'] = bid + i2xpath[f'xpath=/{path}'] = bid + + temp_id += 1 + + # traverse node + children = element.getchildren() + tag_dict = {} + id_list = [] + for child in children: + ctag = child.tag.lower() + if ctag not in tag_dict: + tag_dict[ctag] = 0 + tag_dict[ctag] += 1 + id_list.append(tag_dict[ctag]) + + for cid, child in zip(id_list, children): + ctag = child.tag.lower() + cod = cid if tag_dict[ctag] > 1 else 0 + temp_id, i2x, ulabels = get_xpath_top_down(child, id_column, label_column, path, cod, in_svg, temp_id) + i2xpath.update(i2x) + used_labels.update(ulabels) + + return temp_id, i2xpath, used_labels + +def print_html_object(obj: str='') -> str: + tab_cnt = 0 + result, content, sep = '', '', '' + last_is_left, last_is_right = False, False + for ch in obj: + if ch == '<': + result += '\n' + if len(content.strip()) > 0: + result += sep + content.strip() + '\n' + result += sep + '<' + + tab_cnt += 1 + sep = ' ' * tab_cnt + + content = '' + last_is_right = False + last_is_left = True + elif ch == '>': + if last_is_left: + result += content + else: + if last_is_right: + result += '\n' + if len(content.strip()) > 0: + result += sep + content.strip() + '\n' + + tab_cnt -= 1 + sep = ' ' * tab_cnt + + if not last_is_left: + result += sep + + result += '>' + content = '' + + last_is_right = True + last_is_left = False + else: + content += ch + + return result + +def rect2tuple(rect: str) -> tuple[int, int, int, int]: + if rect is None or type(rect) != type('str'): + return None + rect = rect.strip() + if rect.count(',') != 3: + return None + rect = rect.split(',') + rect = [float(r) for r in rect] + return tuple(rect) \ No newline at end of file diff --git a/browser_env/processors.py b/browser_env/processors.py new file mode 100644 index 0000000..e7daadd --- /dev/null +++ b/browser_env/processors.py @@ -0,0 +1,1125 @@ +import json +import lxml +import re +from collections import defaultdict +from typing import Any, TypedDict, Union + +import numpy as np +import numpy.typing as npt +from gymnasium import spaces +from playwright.sync_api import CDPSession, Page, ViewportSize + +from browser_env.constants import ( + ASCII_CHARSET, + FREQ_UNICODE_CHARSET, + IGNORED_ACTREE_PROPERTIES, + UTTERANCE_MAX_LENGTH, +) + +from .utils import ( + AccessibilityTree, + AccessibilityTreeNode, + BrowserConfig, + BrowserInfo, + DOMNode, + DOMTree, + Observation, + png_bytes_to_numpy, +) + +from .html_tools import HtmlParser, basic_attrs, print_html_object + +IN_VIEWPORT_RATIO_THRESHOLD = 0.8 + +class TreeNode: + def __init__(self, node_id, role, name, depth, **kwargs): + self.visible = True + self.node_id = node_id + self.role = role + self.name = name + self.depth = depth + self.properties = None + if "properties" in kwargs.keys(): + self.properties = kwargs["properties"] + + self.children = [] + self.parent = None + + def add_child(self, child): + child.parent = self + self.children.append(child) + + def copy(self): + from copy import deepcopy + new_self = deepcopy(self) + new_self.children = [] + new_self.parent = None + return new_self + + def get_visible_node_number(self): + visible_ids = [] + + def dfs(current_node): + if current_node.visible: + visible_ids.append(current_node.node_id) + for child in current_node.children: + dfs(child) + + dfs(self) + + return len(visible_ids) + + def delete_tree(self): + for child in self.children: + child.delete_tree() + self.children.clear() + self.parent = None + + def has_properties(self): + return getattr(self, "properties", {}) + + def visible_children(self): + return [c for c in self.children if c.visible] + + def visible_siblings(self): + if not self.parent: + return [] + return [n for n in self.parent.children if n.visible and n.node_id != self.node_id] + + def siblings(self): + if not self.parent: + return [] + return [n for n in self.parent.children if n.node_id != self.node_id] + + def search_node_by_id(self, target_id): + if self.node_id == target_id or (self.name and f"[{target_id}]" in self.name): + return self + for child in self.children: + result = child.search_node_by_id(target_id) + if result: + return result + return None + + def all_children_invisible(self): + if not self.children: + return True + for child in self.children: + if child.visible: + return False + return True + + def has_the_same_properties_as(self, another_node): + node_a_has_properties = getattr(self, "properties", "") + node_b_has_properties = getattr(another_node, "properties", "") + if not node_a_has_properties and not node_b_has_properties: + return True + elif (node_a_has_properties and not node_b_has_properties) or (not node_a_has_properties and node_b_has_properties): + return False + else: + return self.properties == another_node.properties + + def is_identical_to(self, another_node): + if another_node.children: + return False + return self.role == another_node.role and self.name == another_node.name and self.has_the_same_properties_as(another_node=another_node) + + def last_sibling(self, visible_required=False): + if not self.parent: + return None + last_sibling_idx = self.parent.children.index(self) - 1 + if last_sibling_idx < 0: + return None + if not visible_required: + return self.parent.children[last_sibling_idx] + for sibling in self.parent.children[:self.parent.children.index(self):-1]: + if sibling.visible: + return sibling + return None + + def next_sibling(self, visible_required=False): + if not self.parent: + return None + next_sibling_idx = self.parent.children.index(self) + 1 + if next_sibling_idx >= len(self.parent.children): + return None + if not visible_required: + return self.parent.children[next_sibling_idx] + for sibling in self.parent.children[next_sibling_idx:]: + if sibling.visible: + return sibling + return None + + def has_identical_siblings(self): + if not (self.parent and self.all_children_invisible()): + return False + if any(sibling.role == self.role and sibling.name == self.name for sibling in self.parent.children if (sibling.node_id != self.node_id and sibling.all_children_invisible())): + return True + return False + + def has_identical_surrounding_siblings(self): + if self.last_sibling(visible_required=False): + if self.is_identical_to(self.last_sibling(visible_required=False)): + return True + if self.last_sibling(visible_required=True): + if self.is_identical_to(self.last_sibling(visible_required=True)): + return True + if self.next_sibling(visible_required=False): + if self.is_identical_to(self.next_sibling(visible_required=False)): + return True + if self.next_sibling(visible_required=True): + if self.is_identical_to(self.next_sibling(visible_required=True)): + return True + return False + + def is_differentiable(self, strict=False): + if self.parent and self.parent.role == "row": + return True + if not strict and self.has_identical_siblings(): + return False + if self.has_identical_surrounding_siblings(): + return False + return True + + +class ObservationProcessor: + def process(self, page: Page, client: CDPSession) -> Observation: + raise NotImplementedError + + +class ObservationMetadata(TypedDict): + obs_nodes_info: dict[str, Any] + + +def create_empty_metadata() -> ObservationMetadata: + return { + "obs_nodes_info": {}, + } + + +class TextObervationProcessor(ObservationProcessor): + def __init__( + self, + observation_type: str, + current_viewport_only: bool, + viewport_size: ViewportSize, + ): + self.observation_type = observation_type + self.current_viewport_only = current_viewport_only + self.viewport_size = viewport_size + self.observation_tag = "text" + self.meta_data = ( + create_empty_metadata() + ) # use the store meta data of this observation type + + def fetch_browser_info( + self, + page: Page, + client: CDPSession, + ) -> BrowserInfo: + # extract domtree + tree = client.send( + "DOMSnapshot.captureSnapshot", + { + "computedStyles": [], + "includeDOMRects": True, + "includePaintOrder": True, + }, + ) + + # calibrate the bounds, in some cases, the bounds are scaled somehow + bounds = tree["documents"][0]["layout"]["bounds"] + b = bounds[0] + n = b[2] / self.viewport_size["width"] + bounds = [[x / n for x in bound] for bound in bounds] + tree["documents"][0]["layout"]["bounds"] = bounds + + # extract browser info + win_top_bound = page.evaluate("window.pageYOffset") + win_left_bound = page.evaluate("window.pageXOffset") + win_width = page.evaluate("window.screen.width") + win_height = page.evaluate("window.screen.height") + win_right_bound = win_left_bound + win_width + win_lower_bound = win_top_bound + win_height + device_pixel_ratio = page.evaluate("window.devicePixelRatio") + assert device_pixel_ratio == 1.0, "devicePixelRatio is not 1.0" + + config: BrowserConfig = { + "win_top_bound": win_top_bound, + "win_left_bound": win_left_bound, + "win_width": win_width, + "win_height": win_height, + "win_right_bound": win_right_bound, + "win_lower_bound": win_lower_bound, + "device_pixel_ratio": device_pixel_ratio, + } + + # assert len(tree['documents']) == 1, "More than one document in the DOM tree" + info: BrowserInfo = {"DOMTree": tree, "config": config} + # with open('output/browser_info.json', 'w') as f: + # f.write(json.dumps(tree, ensure_ascii=False)) + return info + + @staticmethod + def get_bounding_client_rect( + client: CDPSession, backend_node_id: str + ) -> dict[str, Any]: + try: + remote_object = client.send( + "DOM.resolveNode", {"backendNodeId": int(backend_node_id)} + ) + remote_object_id = remote_object["object"]["objectId"] + response = client.send( + "Runtime.callFunctionOn", + { + "objectId": remote_object_id, + "functionDeclaration": """ + function() { + if (this.nodeType == 3) { + var range = document.createRange(); + range.selectNode(this); + var rect = range.getBoundingClientRect().toJSON(); + range.detach(); + return rect; + } else { + return this.getBoundingClientRect().toJSON(); + } + } + """, + "returnByValue": True, + }, + ) + return response + except Exception as e: + return {"result": {"subtype": "error"}} + + @staticmethod + def get_element_in_viewport_ratio( + elem_left_bound: float, + elem_top_bound: float, + width: float, + height: float, + config: BrowserConfig, + ) -> float: + elem_right_bound = elem_left_bound + width + elem_lower_bound = elem_top_bound + height + + win_left_bound = 0 + win_right_bound = config["win_width"] + win_top_bound = 0 + win_lower_bound = config["win_height"] + + # Compute the overlap in x and y axes + overlap_width = max( + 0, + min(elem_right_bound, win_right_bound) + - max(elem_left_bound, win_left_bound), + ) + overlap_height = max( + 0, + min(elem_lower_bound, win_lower_bound) + - max(elem_top_bound, win_top_bound), + ) + + # Compute the overlap area + ratio = overlap_width * overlap_height / width * height + return ratio + + def element_is_visible(self, page, element_id): + def _get_element_in_viewport_ratio( + elem_left_bound: float, + elem_top_bound: float, + width: float, + height: float, + config: BrowserConfig, + ) -> float: + def calculate_overlap(start1, end1, start2, end2): + # Calculate overlap + overlap_start = max(start1, start2) + overlap_end = min(end1, end2) + + # Check if there's overlap + if overlap_start < overlap_end: + overlap = overlap_end - overlap_start + else: + overlap = 0 + + return overlap + elem_right_bound = elem_left_bound + width + elem_lower_bound = elem_top_bound + height + + win_left_bound = 0 + win_right_bound = config["win_width"] + win_top_bound = 0 + win_lower_bound = config["win_height"] + + overlap_width = calculate_overlap(elem_left_bound, elem_right_bound, win_left_bound, win_right_bound) + overlap_height = calculate_overlap(elem_top_bound, elem_lower_bound, win_top_bound, win_lower_bound) + + try: + ratio = (overlap_width * overlap_height) / (width * height) + return ratio + except: + return 1 #TODO + try: + browser_info = self.fetch_browser_info(page, page.client) + except Exception: + page.wait_for_load_state("load", timeout=500) + browser_info = self.fetch_browser_info(page, page.client) + + response = self.get_bounding_client_rect( + page.client, self.obs_nodes_info[element_id]["backend_id"] + ) + + x = response["result"]["value"]["x"] + y = response["result"]["value"]["y"] + width = response["result"]["value"]["width"] + height = response["result"]["value"]["height"] + + + in_viewport_ratio = _get_element_in_viewport_ratio( + elem_left_bound=float(x), + elem_top_bound=float(y), + width=float(width), + height=float(height), + config=browser_info["config"], + ) + + if in_viewport_ratio < IN_VIEWPORT_RATIO_THRESHOLD: + return False + + return True + + def fetch_page_html( + self, + info: BrowserInfo, + page: Page, + client: CDPSession, + current_viewport_only: bool, + ) -> DOMTree: + # adopted from [natbot](https://github.com/nat/natbot) + tree = info["DOMTree"] + config = info["config"] + strings = tree["strings"] + document = tree["documents"][0] + nodes = document["nodes"] + layout = document["layout"] + + import time + stt = time.time() + # make a dom tree that is easier to navigate + dom_tree: DOMTree = [] + graph = defaultdict(list) + print(nodes.keys()) + for node_idx in range(len(nodes["nodeName"])): + cur_node: DOMNode = { + "nodeId": "", + "nodeType": "", + "nodeName": "", + "nodeValue": "", + "attributes": "", + "backendNodeId": "", + "parentId": "", + "childIds": [], + "cursor": 0, + "union_bound": None, + } + + node_type_idx = nodes["nodeType"][node_idx] + node_type = "generic" + if node_type_idx >= 0 and node_type_idx < len(strings): + node_type = strings[node_type_idx] + + node_name = strings[nodes["nodeName"][node_idx]] + + node_value_idx = nodes["nodeValue"][node_idx] + node_value = "" + if node_value_idx >= 0 and node_value_idx < len(strings): + node_value = " ".join(strings[node_value_idx].split()) + + node_attributes = [ + strings[i] for i in nodes["attributes"][node_idx] + ] + node_attributes_str = "" + for i in range(0, len(node_attributes), 2): + a = node_attributes[i] + b = node_attributes[i + 1] + # b = " ".join(b.split()) + import re + b = re.sub(r"{\s*opacity:\s*.*;*\s*}", " ", b) + b = [b_item for b_item in b.split() if b_item.count('vimium') == 0] + b = " ".join(b) + node_attributes_str += f'{a}="{b}" ' + + node_attributes_str = node_attributes_str.strip() + + cur_node["nodeId"] = str(node_idx) + cur_node["nodeType"] = node_type + cur_node["nodeName"] = node_name + cur_node["nodeValue"] = node_value + cur_node["attributes"] = node_attributes_str + cur_node["backendNodeId"] = str(nodes["backendNodeId"][node_idx]) + cur_node["parentId"] = str(nodes["parentIndex"][node_idx]) + + if cur_node["parentId"] != "-1": + graph[cur_node["parentId"]].append(str(cur_node["nodeId"])) + + # get the bound + if cur_node["parentId"] == "-1": + cur_node["union_bound"] = [0.0, 0.0, 10.0, 10.0] + else: + # method 1 + # response = self.get_bounding_client_rect( + # client, cur_node["backendNodeId"] + # ) + + # if response.get("result", {}).get("subtype", "") == "error": + # cur_node["union_bound"] = None + # else: + # x = response["result"]["value"]["x"] + # y = response["result"]["value"]["y"] + # width = response["result"]["value"]["width"] + # height = response["result"]["value"]["height"] + # cur_node["union_bound"] = [x, y, width, height] + + # method 2 + bound = [0.0, 0.0, 0.0, 0.0] + if node_idx in layout["nodeIndex"]: + bound = layout["bounds"][layout["nodeIndex"].index(node_idx)] + bound[0] -= config["win_left_bound"] + bound[1] -= config["win_top_bound"] + + cur_node["union_bound"] = bound + + dom_tree.append(cur_node) + print('[build]', time.time() - stt) + + stt = time.time() + # add parent children index to the node + for parent_id, child_ids in graph.items(): + dom_tree[int(parent_id)]["childIds"] = child_ids + print('[graph]', time.time() - stt) + + # with open('output/dom_tree.json', 'w') as f: + # f.write(json.dumps(dom_tree, ensure_ascii=False)) + + stt = time.time() + # remove the nodes that are not in the current viewport + if current_viewport_only: + + def remove_node_in_graph(node: DOMNode) -> None: + # update the node information in the accessibility tree + node_id = node["nodeId"] + parent_id = node["parentId"] + child_ids = node["childIds"] + + # update the children of the parent node + assert dom_tree[int(parent_id)]["parentId"] != "[REMOVED]" + # remove the nodeid from parent + index = dom_tree[int(parent_id)]["childIds"].index(node_id) + dom_tree[int(parent_id)]["childIds"].pop(index) + + # Insert children_nodeids in the same location + for child_id in child_ids: + dom_tree[int(parent_id)]["childIds"].insert( + index, child_id + ) + index += 1 + + # update children node's parent + for child_id in child_ids: + dom_tree[int(child_id)]["parentId"] = parent_id + # mark as removed + dom_tree[int(node_id)]["parentId"] = "[REMOVED]" + + config = info["config"] + for cursor, node in enumerate(dom_tree): + if not node["union_bound"]: + remove_node_in_graph(node) + continue + + [x, y, width, height] = node["union_bound"] + + # invisible node + if width == 0.0 or height == 0.0: + parent_id = node["parentId"] + if node["nodeName"] not in ['OPTION'] or dom_tree[int(parent_id)]["nodeName"] not in ["SELECT"]: + remove_node_in_graph(node) + continue + + in_viewport_ratio = self.get_element_in_viewport_ratio( + elem_left_bound=float(x), + elem_top_bound=float(y), + width=float(width), + height=float(height), + config=config, + ) + + if in_viewport_ratio < IN_VIEWPORT_RATIO_THRESHOLD: + remove_node_in_graph(node) + + dom_tree = [ + node + for node in dom_tree + if node.get("parentId", "-1") != "[REMOVED]" + ] + + print('[filter]', time.time() - stt) + return dom_tree + + @staticmethod + def parse_my_html(dom_tree: DOMTree) -> tuple[str, str, dict[str, Any], Any]: + """Parse the html tree into a string text""" + + obs_nodes_info = {} + nodeid_to_cursor = { + node["nodeId"]: idx for idx, node in enumerate(dom_tree) + } + + def dfs(node_cursor: int, depth: int) -> tuple[str, list[str]]: + tree_str, labeled_elems = '', [] + node = dom_tree[node_cursor] + valid_node = True + pure_text = False + try: + if node['nodeName'] == '#text': + node['nodeName'] = 'text' + + node_str = f"<{node['nodeName']}" + if node["attributes"]: + node_str += f" {node['attributes']}" + node_str += f" backend-id=\"bid-{node['backendNodeId']}\"> {node['nodeValue']}" + + # if node['nodeName'] == '#text': + # pure_text = True + # node_str = node['nodeValue'] + + valid_node = bool(node["attributes"] or node["nodeValue"] or pure_text) + + if valid_node: + node_html = lxml.html.fromstring(node_str) + label = node_html.attrib.get('data-testid', '') + if len(label) > 0: + labeled_elems.append(node["backendNodeId"]) + obs_nodes_info[str(node_cursor)] = { + "backend_id": node["backendNodeId"], + "union_bound": node["union_bound"], + "text": node['nodeValue'], + "label": label, + } + tree_str += f"{node_str}" + + except Exception as e: + valid_node = False + + for child_ids in node["childIds"]: + child_cursor = nodeid_to_cursor[child_ids] + child_depth = depth + 1 if valid_node else depth + child_str, elems = dfs(child_cursor, child_depth) + tree_str += child_str + labeled_elems.extend(elems) + + if valid_node and not pure_text: + tree_str += f"" + + return tree_str, labeled_elems + + html, labeled_elems = dfs(0, 0) + + # with open('output/raw.html', 'w') as f: + # f.write(html) + print(labeled_elems) + + args = { + 'use_position': False, + 'id_attr': 'backend-id', + 'label_generator': 'order', + 'label_attr': 'data-testid', + 'attr_list': basic_attrs, + 'prompt': 'refine', + } + + hp = HtmlParser(html, args) + packet = hp.parse_tree() + page_html = packet['html'] + + print(print_html_object(page_html)) + + it, pt = packet.get('init_time', 0), packet.get('parse_time', 0) + print(f'[Time] {it:.3f} {pt:.3f}') + + return html, page_html, obs_nodes_info, hp + + @staticmethod + def parse_html(dom_tree: DOMTree) -> tuple[str, dict[str, Any]]: + """Parse the html tree into a string text""" + + obs_nodes_info = {} + nodeid_to_cursor = { + node["nodeId"]: idx for idx, node in enumerate(dom_tree) + } + + def dfs(node_cursor: int, depth: int) -> str: + tree_str = "" + node = dom_tree[node_cursor] + indent = "\t" * depth + valid_node = True + try: + node_str = f"[{node_cursor}] <{node['nodeName']}" + if node["attributes"]: + node_str += f" {node['attributes']}" + node_str += f"> {node['nodeValue']}" + valid_node = bool(node["attributes"] or node["nodeValue"]) + + if valid_node: + obs_nodes_info[str(node_cursor)] = { + "backend_id": node["backendNodeId"], + "union_bound": node["union_bound"], + "text": node_str, + } + tree_str += f"{indent}{node_str}\n" + + except Exception as e: + valid_node = False + + for child_ids in node["childIds"]: + child_cursor = nodeid_to_cursor[child_ids] + child_depth = depth + 1 if valid_node else depth + child_str = dfs(child_cursor, child_depth) + tree_str += child_str + + return tree_str + + html = dfs(0, 0) + return html, obs_nodes_info + + def fetch_page_accessibility_tree( + self, + info: BrowserInfo, + client: CDPSession, + current_viewport_only: bool, + ) -> AccessibilityTree: + accessibility_tree: AccessibilityTree = client.send( + "Accessibility.getFullAXTree", {} + )["nodes"] + + # a few nodes are repeated in the accessibility tree + seen_ids = set() + _accessibility_tree = [] + for node in accessibility_tree: + if node["nodeId"] not in seen_ids: + _accessibility_tree.append(node) + seen_ids.add(node["nodeId"]) + accessibility_tree = _accessibility_tree + nodeid_to_cursor = {} + for cursor, node in enumerate(accessibility_tree): + nodeid_to_cursor[node["nodeId"]] = cursor + # usually because the node is not visible etc + if "backendDOMNodeId" not in node: + node["union_bound"] = None + continue + backend_node_id = str(node["backendDOMNodeId"]) + if node["role"]["value"] == "RootWebArea": + # always inside the viewport + node["union_bound"] = [0.0, 0.0, 10.0, 10.0] + else: + response = self.get_bounding_client_rect( + client, backend_node_id + ) + if response.get("result", {}).get("subtype", "") == "error": + node["union_bound"] = None + else: + x = response["result"]["value"]["x"] + y = response["result"]["value"]["y"] + width = response["result"]["value"]["width"] + height = response["result"]["value"]["height"] + node["union_bound"] = [x, y, width, height] + + # filter nodes that are not in the current viewport + if current_viewport_only: + + def remove_node_in_graph(node: AccessibilityTreeNode) -> None: + # update the node information in the accessibility tree + nodeid = node["nodeId"] + node_cursor = nodeid_to_cursor[nodeid] + parent_nodeid = node["parentId"] + children_nodeids = node["childIds"] + parent_cursor = nodeid_to_cursor[parent_nodeid] + # update the children of the parent node + assert ( + accessibility_tree[parent_cursor].get("parentId", "Root") + is not None + ) + # remove the nodeid from parent's childIds + index = accessibility_tree[parent_cursor]["childIds"].index( + nodeid + ) + accessibility_tree[parent_cursor]["childIds"].pop(index) + # Insert children_nodeids in the same location + for child_nodeid in children_nodeids: + accessibility_tree[parent_cursor]["childIds"].insert( + index, child_nodeid + ) + index += 1 + # update children node's parent + for child_nodeid in children_nodeids: + child_cursor = nodeid_to_cursor[child_nodeid] + accessibility_tree[child_cursor][ + "parentId" + ] = parent_nodeid + # mark as removed + accessibility_tree[node_cursor]["parentId"] = "[REMOVED]" + + config = info["config"] + for node in accessibility_tree: + if not node["union_bound"]: + remove_node_in_graph(node) + continue + + [x, y, width, height] = node["union_bound"] + + # invisible node + if width == 0 or height == 0: + remove_node_in_graph(node) + continue + + in_viewport_ratio = self.get_element_in_viewport_ratio( + elem_left_bound=float(x), + elem_top_bound=float(y), + width=float(width), + height=float(height), + config=config, + ) + + if in_viewport_ratio < IN_VIEWPORT_RATIO_THRESHOLD: + remove_node_in_graph(node) + + accessibility_tree = [ + node + for node in accessibility_tree + if node.get("parentId", "Root") != "[REMOVED]" + ] + + return accessibility_tree + + @staticmethod + def parse_accessibility_tree( + accessibility_tree: AccessibilityTree, + ) -> tuple[str, dict[str, Any], TreeNode]: + """Parse the accessibility tree into a string text""" + node_id_to_idx = {} + for idx, node in enumerate(accessibility_tree): + node_id_to_idx[node["nodeId"]] = idx + + obs_nodes_info = {} + + def dfs(idx: int, obs_node_id: str, depth: int, active_node_dict: dict) -> str: + tree_str = "" + node = accessibility_tree[idx] + indent = "\t" * depth + valid_node = True + try: + role = node["role"]["value"] + name = node["name"]["value"] + node_str = f"[{obs_node_id}] {role} {repr(name)}" + properties = [] + structured_properties = {} + for property in node.get("properties", []): + try: + if property["name"] in IGNORED_ACTREE_PROPERTIES: + continue + properties.append( + f'{property["name"]}: {property["value"]["value"]}' + ) + structured_properties[property["name"]] = property["value"]["value"] + except KeyError: + pass + + if properties: + node_str += " " + " ".join(properties) + + # check valid + if not node_str.strip(): + valid_node = False + + # empty generic node + if not name.strip(): + if not properties: + if role in [ + "generic", + "img", + "list", + "strong", + "paragraph", + "banner", + "navigation", + "Section", + "LabelText", + "Legend", + "listitem", + ]: + valid_node = False + elif role in ["listitem"]: + valid_node = False + + if valid_node: + tree_str += f"{indent}{node_str}" + obs_nodes_info[obs_node_id] = { + "backend_id": node["backendDOMNodeId"], + "union_bound": node["union_bound"], + "text": node_str, + } + + except Exception as e: + valid_node = False + + structured_node = TreeNode(node_id=int(obs_node_id), role=node["role"]["value"], name=node["name"]["value"], depth=depth, properties=structured_properties) if valid_node else None + active_node_dict[depth] = structured_node if valid_node else active_node_dict.get(depth, None) + + for _, child_node_id in enumerate(node["childIds"]): + if child_node_id not in node_id_to_idx: + continue + # mark this to save some tokens + child_depth = depth + 1 if valid_node else depth + child_str, child_node = dfs( + node_id_to_idx[child_node_id], child_node_id, child_depth, active_node_dict=active_node_dict + ) + if child_str.strip(): + if tree_str.strip(): + tree_str += "\n" + tree_str += child_str + if child_depth > 0 and child_node: + active_node_dict[child_depth - 1].add_child(child_node) + + return tree_str, structured_node + + tree_str, structured_node = dfs(0, accessibility_tree[0]["nodeId"], 0, active_node_dict={}) + return tree_str, obs_nodes_info, structured_node + + @staticmethod + def clean_accesibility_tree(tree_str: str) -> str: + """further clean accesibility tree""" + clean_lines: list[str] = [] + for line in tree_str.split("\n"): + if "statictext" in line.lower(): + prev_lines = clean_lines[-3:] + pattern = r"\[\d+\] StaticText '([^']+)'" + + match = re.search(pattern, line) + if match: + static_text = match.group(1) + if all( + static_text not in prev_line + for prev_line in prev_lines + ): + clean_lines.append(line) + else: + clean_lines.append(line) + + return "\n".join(clean_lines) + + def process(self, page: Page, client: CDPSession, context: str) -> str: + # get the tab info + open_tabs = page.context.pages + # try: + # tab_titles = [tab.title() for tab in open_tabs] + # current_tab_idx = open_tabs.index(page) + # for idx in range(len(open_tabs)): + # if idx == current_tab_idx: + # tab_titles[ + # idx + # ] = f"Tab {idx} (current): {open_tabs[idx].title()}" + # else: + # tab_titles[idx] = f"Tab {idx}: {open_tabs[idx].title()}" + # tab_title_str = " | ".join(tab_titles) + # except Exception: + # tab_title_str = " | ".join( + # ["Tab {idx}" for idx in range(len(open_tabs))] + # ) + + try: + tab_titles = [tab.title() for tab in open_tabs] + current_tab_idx = open_tabs.index(page) + for idx in range(len(open_tabs)): + if idx == current_tab_idx: + tab_titles[ + idx + ] = f"{idx+1}. {open_tabs[idx].title()} <-- current tab" + else: + tab_titles[idx] = f"{idx+1}. {open_tabs[idx].title()}" + tab_title_str = "\n".join(tab_titles) + except Exception: + tab_title_str = "\n".join( + [f"{idx+1}. Default" for idx in range(len(open_tabs))] + ) + + + try: + browser_info = self.fetch_browser_info(page, client) + except Exception: + page.wait_for_load_state("load", timeout=500) + browser_info = self.fetch_browser_info(page, client) + + if self.observation_type == "html": + import time + stt = time.time() + dom_tree = self.fetch_page_html( + browser_info, + page, + client, + current_viewport_only=self.current_viewport_only, + ) + + print('[fetch]', time.time() - stt) + + stt = time.time() + raw_html, content, obs_nodes_info, hp = self.parse_my_html(dom_tree) + print('[parse]', time.time() - stt) + + window_height = page.evaluate("window.innerHeight") + page_height = page.evaluate('document.documentElement.scrollHeight') / window_height + position = page.evaluate("window.scrollY") / window_height + + self.obs_nodes_info = obs_nodes_info + self.meta_data["obs_nodes_info"] = obs_nodes_info + self.meta_data["position_info"] = { + "page_height": page_height, + "position": position, + } + self.meta_data["dom_info"] = { + "raw_html": raw_html, + "dom_tree": dom_tree, + } + self.meta_data["html_parser"] = hp + self.meta_data["tab_title"] = tab_title_str + + elif self.observation_type == "accessibility_tree": + accessibility_tree = self.fetch_page_accessibility_tree( + browser_info, + client, + current_viewport_only=self.current_viewport_only, + ) + content, obs_nodes_info, node_root = self.parse_accessibility_tree( + accessibility_tree + ) + content = self.clean_accesibility_tree(content) + self.obs_nodes_info = obs_nodes_info + page_dialog_message = getattr(page, "dialog_message", "") + if page_dialog_message: + import copy + node_root.properties["page_dialog_message"] = copy.deepcopy(page_dialog_message) + " Retry." + page.dialog_message = None + self.node_root = node_root + self.meta_data["obs_nodes_info"] = obs_nodes_info + + else: + raise ValueError( + f"Invalid observatrion type: {self.observation_type}" + ) + + self.browser_config = browser_info["config"] + # content = f"{tab_title_str}\n\n{content}" + return (content, node_root) + + def get_node_info_by_element_id(self, AXTreeId): + return self.node_root.search_node_by_id(AXTreeId) + + def get_element_center(self, element_id: str, page) -> tuple[float, float]: + node = self.obs_nodes_info[element_id] + backend_node_id = str(node["backend_id"]) + response = self.get_bounding_client_rect( + page.client, backend_node_id + ) + x = response["result"]["value"]["x"] + y = response["result"]["value"]["y"] + width = response["result"]["value"]["width"] + height = response["result"]["value"]["height"] + center_x = x + width / 2 + center_y = y + height / 2 + return ( + center_x / self.viewport_size["width"], + center_y / self.viewport_size["height"], + ) + + +class ImageObservationProcessor(ObservationProcessor): + def __init__(self, observation_type: str, current_viewport_only: bool): + self.observation_type = observation_type + self.current_viewport_only = current_viewport_only + self.observation_tag = "image" + self.meta_data = create_empty_metadata() + + def process(self, page: Page, client: CDPSession, context: str) -> npt.NDArray[np.uint8]: + try: + screenshot = png_bytes_to_numpy(page.screenshot(full_page=(not self.current_viewport_only))) + screenshot = screenshot[:2*screenshot.shape[1], :, :] + except: + page.wait_for_event("load") + screenshot = png_bytes_to_numpy(page.screenshot(full_page=(not self.current_viewport_only))) + return screenshot + + +class ObservationHandler: + """Main entry point to access all observation processor""" + + def __init__( + self, + main_observation_type: str, + text_observation_type: str, + image_observation_type: str, + current_viewport_only: bool, + viewport_size: ViewportSize, + ) -> None: + self.main_observation_type = main_observation_type + self.text_processor = TextObervationProcessor( + text_observation_type, current_viewport_only, viewport_size + ) + self.image_processor = ImageObservationProcessor( + image_observation_type, current_viewport_only + ) + self.viewport_size = viewport_size + + def get_observation_space(self) -> spaces.Dict: + text_space = spaces.Text( + min_length=0, + max_length=UTTERANCE_MAX_LENGTH, + charset=ASCII_CHARSET + FREQ_UNICODE_CHARSET, + ) + + image_space = spaces.Box( + # Each position stores the RGB values. Note the swapped axes (height first). + np.zeros( + (self.viewport_size["height"], self.viewport_size["width"], 3), + dtype=np.uint8, + ), + np.ones( + (self.viewport_size["height"], self.viewport_size["width"], 3), + dtype=np.uint8, + ) + * 255.0, + dtype=np.uint8, + ) + + return spaces.Dict({"text": text_space, "image": image_space}) + + def get_observation( + self, page: Page, client: CDPSession, context: str = '', + ) -> dict[str, Observation]: + text_obs = self.text_processor.process(page, client, context) + image_obs = self.image_processor.process(page, client, context) + return {"text": text_obs, "image": image_obs} + + def get_observation_metadata(self) -> dict[str, ObservationMetadata]: + return { + "text": self.text_processor.meta_data, + "image": self.image_processor.meta_data, + } + + @property + def action_processor(self) -> ObservationProcessor: + """Return the main processor that is associated with the action space""" + if self.main_observation_type == "text": + return self.text_processor + elif self.main_observation_type == "image": + return self.image_processor + else: + raise ValueError("Invalid main observation type") diff --git a/browser_env/py.typed b/browser_env/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/browser_env/scripts/__init__.py b/browser_env/scripts/__init__.py new file mode 100644 index 0000000..719e3e3 --- /dev/null +++ b/browser_env/scripts/__init__.py @@ -0,0 +1,43 @@ +import os +from pathlib import Path +rootdir = Path(__file__).parent + +# marker, gpt-4v-act style +with open(os.path.join(rootdir, 'local_marker.js'), 'r') as f: + local_marker_script = f.read() + +with open(os.path.join(rootdir, 'mix_marker.js'), 'r') as f: + mix_marker_script = f.read() + +with open(os.path.join(rootdir, 'get_data.js'), 'r') as f: + get_rect_script = f.read() + +# canva handler +with open(os.path.join(rootdir, 'canva_handler.js'), 'r') as f: + canva_handler_script = f.read() + +# draw label on page +with open(os.path.join(rootdir, 'label_marker.js'), 'r') as f: + label_marker_script = f.read() + +# get text from page +with open(os.path.join(rootdir, 'get_text.js'), 'r') as f: + get_text_script = f.read() + +# remove label draw on page +remove_label_mark_script = """ + () => { + document.querySelectorAll(".our-dom-marker").forEach(item => { + document.body.removeChild(item); + }); + } +""" + +remove_id_script = """ + () => { + Array.from(document.getElementsByClassName('possible-clickable-element')).forEach((element) => { + element.classList.remove('possible-clickable-element'); + element.removeAttribute('data-testid'); + }); + } +""" diff --git a/browser_env/scripts/canva_handler.js b/browser_env/scripts/canva_handler.js new file mode 100644 index 0000000..997ec78 --- /dev/null +++ b/browser_env/scripts/canva_handler.js @@ -0,0 +1,44 @@ +() => { + var items = Array.prototype.slice.call( + document.querySelectorAll("canvas") + ); + + var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + + items = items.map(element => { + // var img = element.toDataURL("image/png"); + var bb = element.getClientRects(); + var rect = { + left: -1, + top: -1, + right: -1, + bottom: -1, + width: 0, + height: 0, + }; + if (bb.length > 0) { + bb = bb[0]; + rect = { + left: Math.max(0, bb.left), + top: Math.max(0, bb.top), + right: Math.min(vw, bb.right), + bottom: Math.min(vh, bb.bottom) + }; + rect = { + ...rect, + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + } + + return { + rects: rect, + tag: element.tagName.toLowerCase?.() || "", + text: element.textContent.trim().replace(/\s{2,}/g, ' '), + // img: img + }; + }); + + return items; +} \ No newline at end of file diff --git a/browser_env/scripts/get_data.js b/browser_env/scripts/get_data.js new file mode 100644 index 0000000..492a52a --- /dev/null +++ b/browser_env/scripts/get_data.js @@ -0,0 +1,73 @@ +(packet) => { + function int2str(index) { + var str = ""; + while (index >= 0) { + str = String.fromCharCode(65 + index % 26) + str; + index = Math.floor(index / 26) - 1; + } + return str; + }; + + selector = packet.selector + index = packet.startIndex + var items = Array.prototype.slice.call( + document.querySelectorAll(selector) + ); + + var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + + items = items.filter( + x => !items.some(y => x.contains(y) && !(x == y)) + ).map(element => { + var bb = element.getClientRects(); + var rect = { + left: 0, + top: 0, + right: 0, + bottom: 0, + width: 0, + height: 0 + }; + var keep = false; + var text = "", id = -1; + if (bb.length > 0) { + bb = bb[0]; + rect = { + left: Math.max(0, bb.left), + top: Math.max(0, bb.top), + right: Math.min(vw, bb.right), + bottom: Math.min(vh, bb.bottom) + }; + rect = { + ...rect, + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + if (rect.width > 0 || rect.height > 0) { + keep = true; + if (index >= 0) { + id = int2str(index++); + element.setAttribute("data-testid", id); + } + var childNodes = element.childNodes; + + for (var i = 0; i < childNodes.length; i++) { + if (childNodes[i].nodeType == Node.TEXT_NODE) { + text += childNodes[i].textContent; + } + } + } + } + + return { + keep: true, + id, + rects: rect, + tag: element.tagName.toLowerCase?.() || "", + text,//: element.innerText?.trim().replace(/\s{2,}/g, " ") || "" + }; + }).filter(x => x.keep); + + return [items, index]; +} \ No newline at end of file diff --git a/browser_env/scripts/get_text.js b/browser_env/scripts/get_text.js new file mode 100644 index 0000000..e583ed4 --- /dev/null +++ b/browser_env/scripts/get_text.js @@ -0,0 +1,48 @@ +() => { + var items = Array.prototype.slice.call( + document.querySelectorAll("*") + ); + + var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + const ignoreTags = ["script", "html"]; + items = items.map(element => { + const tag = element.tagName.toLowerCase?.() || ""; + var bb = element.getClientRects(); + var keep = false; + var text = ''; + + const domId = element.getAttribute('data-testid'); + var id = domId? parseInt(domId): "-"; + + if (bb.length > 0) { + bb = bb[0]; + var width = Math.min(vw, bb.right) - Math.max(0, bb.left); + var height = Math.min(vh, bb.bottom) - Math.max(0, bb.top); + + if (width > 0 && height > 0) { + keep = true; + var childNodes = element.childNodes; + + for (var i = 0; i < childNodes.length; i++) { + if (childNodes[i].nodeType == Node.TEXT_NODE) { + text += childNodes[i].textContent; + } + } + } + } + + text = text.trim().replace(/\s{2,}/g, ' '); + if (ignoreTags.includes(tag)) keep = false; + if (id == "-" && text.length == 0) keep = false; + + return { + keep, + tag, + id, + text, //:element.innerText?.trim().replace(/\s{2,}/g, " ") || "" + }; + }).filter(x => x.keep); + + return items; +} \ No newline at end of file diff --git a/browser_env/scripts/label_marker.js b/browser_env/scripts/label_marker.js new file mode 100644 index 0000000..6c55af5 --- /dev/null +++ b/browser_env/scripts/label_marker.js @@ -0,0 +1,65 @@ +(items) => { + function getRandomColor() { + var letters = '0123456789ABCDEF'; + var color = '#'; + for (var i = 0; i < 6; i++) { + color += letters[Math.floor(Math.random() * 16)]; + } + return color; + } + + items.filter( + item => item.id != "" + ).forEach((item) => { + const bbox = item.rects; + const id_string = `dom-marker-id-${index}`; + + index = item.id; + + outerElement = document.createElement("div"); + outerElement.classList.add("our-dom-marker"); + // var borderColor = getRandomColor(); + var borderColor = "#FFFF00"; + outerElement.style.outline = `2px dashed ${borderColor}`; + outerElement.style.position = "fixed"; + outerElement.style.left = bbox.left - 2 + "px"; + outerElement.style.top = bbox.top - 2 + "px"; + outerElement.style.width = bbox.width + 4 + "px"; + outerElement.style.height = bbox.height + 4 + "px"; + outerElement.style.pointerEvents = "none"; + outerElement.style.boxSizing = "border-box"; + outerElement.style.zIndex = 2147483647; + + innerElement = document.createElement("div"); + innerElement.classList.add("our-dom-marker"); + innerElement.style.outline = `2px dashed #222288`; + innerElement.style.position = "fixed"; + innerElement.style.left = bbox.left + "px"; + innerElement.style.top = bbox.top + "px"; + innerElement.style.width = bbox.width + "px"; + innerElement.style.height = bbox.height + "px"; + innerElement.style.pointerEvents = "none"; + innerElement.style.boxSizing = "border-box"; + innerElement.style.zIndex = 2147483647; + + // Add floating label at the corner + var label = document.createElement("span"); + var topPosition = 25; + if (bbox.top < 25) topPosition = bbox.top; + label.textContent = index; + label.style.position = "absolute"; + label.style.top = `-${topPosition}px`; + label.style.left = "0px"; + label.style.background = borderColor; + label.style.color = "black"; + label.style.padding = "2px 4px"; + label.style.fontSize = "16px"; + label.style.borderRadius = "2px"; + label.style.fontWeight = "bold"; + outerElement.appendChild(label); + + document.body.appendChild(outerElement); + document.body.appendChild(innerElement); + }) + return items; +} \ No newline at end of file diff --git a/browser_env/scripts/local_marker.js b/browser_env/scripts/local_marker.js new file mode 100644 index 0000000..a21bc0c --- /dev/null +++ b/browser_env/scripts/local_marker.js @@ -0,0 +1,46 @@ +() => { + var items = Array.prototype.slice.call( + document.querySelectorAll('*') + ).map((element) => { + var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + + var rects = [...element.getClientRects()].filter(bb => { + var center_x = bb.left + bb.width / 2; + var center_y = bb.top + bb.height / 2; + var elAtCenter = document.elementFromPoint(center_x, center_y); + + return elAtCenter === element || element.contains(elAtCenter) + }).map(bb => { + const rect = { + left: Math.max(0, bb.left), + top: Math.max(0, bb.top), + right: Math.min(vw, bb.right), + bottom: Math.min(vh, bb.bottom) + }; + return { + ...rect, + width: rect.right - rect.left, + height: rect.bottom - rect.top + } + }); + + var area = rects.reduce((acc, rect) => acc + rect.width * rect.height, 0); + + return { + element: element, + include: window.getComputedStyle(element).cursor == "pointer", + area, + rects, + text: element.textContent.trim().replace(/\s{2,}/g, ' '), + }; + }).filter(item => + item.include && (item.area >= 20) + ) + + items = items.filter(x => !items.some(y => x.element.contains(y.element) && !(x == y))) + + items.forEach(item => { + item.element.classList.add('possible-clickable-element'); + }); +} \ No newline at end of file diff --git a/browser_env/scripts/mix_marker.js b/browser_env/scripts/mix_marker.js new file mode 100644 index 0000000..b3d02e7 --- /dev/null +++ b/browser_env/scripts/mix_marker.js @@ -0,0 +1,148 @@ +() => { + var items = Array.prototype.slice.call( + document.querySelectorAll('*') + ).map(function(element) { + var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + + var rects = [...element.getClientRects()].filter(bb => { + var center_x = bb.left + bb.width / 2; + var center_y = bb.top + bb.height / 2; + var elAtCenter = document.elementFromPoint(center_x, center_y); + + if (!elAtCenter) return false; + return elAtCenter === element || element.contains(elAtCenter) + }).map(bb => { + const rect = { + left: Math.max(0, bb.left), + top: Math.max(0, bb.top), + right: Math.min(vw, bb.right), + bottom: Math.min(vh, bb.bottom) + }; + return { + ...rect, + width: rect.right - rect.left, + height: rect.bottom - rect.top + } + }); + // var rects = []; + var area = rects.reduce((acc, rect) => acc + rect.width * rect.height, 0); + + const tagName = element.tagName.toLowerCase?.() || ""; + let isClickable = ((element.onclick != null) || window.getComputedStyle(element).cursor == "pointer"); + + // Insert area elements that provide click functionality to an img. + if (tagName === "img") { + let mapName = element.getAttribute("usemap"); + if (mapName) { + const imgClientRects = element.getClientRects(); + mapName = mapName.replace(/^#/, "").replace('"', '\\"'); + const map = document.querySelector(`map[name=\"${mapName}\"]`); + if (map && (imgClientRects.length > 0)) isClickable = true; + } + } + + if (!isClickable) { + const role = element.getAttribute("role"); + const clickableRoles = [ + "button", + "tab", + "link", + "checkbox", + "menuitem", + "menuitemcheckbox", + "menuitemradio", + "radio", + ]; + if (role != null && clickableRoles.includes(role.toLowerCase())) { + isClickable = true; + } else { + const contentEditable = element.getAttribute("contentEditable"); + if ( + contentEditable != null && + ["", "contenteditable", "true"].includes(contentEditable.toLowerCase()) + ) { + isClickable = true; + } + } + } + + // Check for jsaction event listeners on the element. + if (!isClickable && element.hasAttribute("jsaction")) { + const jsactionRules = element.getAttribute("jsaction").split(";"); + for (let jsactionRule of jsactionRules) { + const ruleSplit = jsactionRule.trim().split(":"); + if ((ruleSplit.length >= 1) && (ruleSplit.length <= 2)) { + const [eventType, namespace, actionName] = ruleSplit.length === 1 + ? ["click", ...ruleSplit[0].trim().split("."), "_"] + : [ruleSplit[0], ...ruleSplit[1].trim().split("."), "_"]; + if (!isClickable) { + isClickable = (eventType === "click") && (namespace !== "none") && (actionName !== "_"); + } + } + } + } + + if (!isClickable) { + const clickableTags = [ + "input", + "textarea", + "select", + "button", + "a", + "iframe", + "video", + "object", + "embed", + "details" + ]; + isClickable = clickableTags.includes(tagName); + } + + if (!isClickable) { + if (tagName === "label") + isClickable = (element.control != null) && !element.control.disabled; + else if (tagName === "img") + isClickable = ["zoom-in", "zoom-out"].includes(element.style.cursor); + } + + // An element with a class name containing the text "button" might be clickable. However, real + // clickables are often wrapped in elements with such class names. So, when we find clickables + // based only on their class name, we mark them as unreliable. + const className = element.getAttribute("class"); + if (!isClickable && className && className.toLowerCase().includes("button")) { + isClickable = true; + } + + // Elements with tabindex are sometimes useful, but usually not. We can treat them as second + // class citizens when it improves UX, so take special note of them. + const tabIndexValue = element.getAttribute("tabindex"); + const tabIndex = tabIndexValue ? parseInt(tabIndexValue) : -1; + if (!isClickable && !(tabIndex < 0) && !isNaN(tabIndex)) { + isClickable = true; + } + + const idValue = element.getAttribute("id"); + const id = idValue ? idValue.toLowerCase() : ""; + if (isClickable && area == 0) { + const textValue = element.textContent.trim().replace(/\s{2,}/g, ' '); + clickable_msg = `${tagName}[id=${id}] ${isClickable} (${area}) ${textValue}` + } + + return { + element: element, + include: isClickable, + area, + rects, + text: element.textContent.trim().replace(/\s{2,}/g, ' ') + }; + }).filter(item => + item.include && (item.area >= 1) + ); + + items = items.filter(x => !items.some(y => x.element.contains(y.element) && !(x == y))) + + items.forEach(item => { + item.element.classList.add('possible-clickable-element'); + }); +} \ No newline at end of file diff --git a/browser_env/trajectory.py b/browser_env/trajectory.py new file mode 100644 index 0000000..1c4c410 --- /dev/null +++ b/browser_env/trajectory.py @@ -0,0 +1,6 @@ +from typing import Union + +from .actions import Action +from .utils import StateInfo + +Trajectory = list[Union[StateInfo, Action]] diff --git a/browser_env/utils.py b/browser_env/utils.py new file mode 100644 index 0000000..1814242 --- /dev/null +++ b/browser_env/utils.py @@ -0,0 +1,80 @@ +from dataclasses import dataclass +from io import BytesIO +from typing import Any, Dict, TypedDict, Union + +import numpy as np +import numpy.typing as npt +from PIL import Image + + +@dataclass +class DetachedPage: + url: str + content: str # html + + +def png_bytes_to_numpy(png: bytes) -> npt.NDArray[np.uint8]: + """Convert png bytes to numpy array + + Example: + + >>> fig = go.Figure(go.Scatter(x=[1], y=[1])) + >>> plt.imshow(png_bytes_to_numpy(fig.to_image('png'))) + """ + return np.array(Image.open(BytesIO(png))) + + +class AccessibilityTreeNode(TypedDict): + nodeId: str + ignored: bool + role: dict[str, Any] + chromeRole: dict[str, Any] + name: dict[str, Any] + properties: list[dict[str, Any]] + childIds: list[str] + parentId: str + backendDOMNodeId: str + frameId: str + bound: list[float] | None + union_bound: list[float] | None + offsetrect_bound: list[float] | None + + +class DOMNode(TypedDict): + nodeId: str + nodeType: str + nodeName: str + nodeValue: str + attributes: str + backendNodeId: str + parentId: str + childIds: list[str] + cursor: int + union_bound: list[float] | None + + +class BrowserConfig(TypedDict): + win_top_bound: float + win_left_bound: float + win_width: float + win_height: float + win_right_bound: float + win_lower_bound: float + device_pixel_ratio: float + + +class BrowserInfo(TypedDict): + DOMTree: dict[str, Any] + config: BrowserConfig + + +AccessibilityTree = list[AccessibilityTreeNode] +DOMTree = list[DOMNode] + + +Observation = str | npt.NDArray[np.uint8] + + +class StateInfo(TypedDict): + observation: dict[str, Observation] + info: Dict[str, Any] diff --git a/config_files/tasks/stanford_cs_head.json b/config_files/tasks/stanford_cs_head.json new file mode 100644 index 0000000..15f1de2 --- /dev/null +++ b/config_files/tasks/stanford_cs_head.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google" + ], + "task_id": "stanford_cs_head", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "What is the email address of the Dean of the School of Engineering at Stanford University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "widom@stanford.edu" + } + } + } \ No newline at end of file diff --git a/config_files/tasks/tsinghua_da_head.json b/config_files/tasks/tsinghua_da_head.json new file mode 100644 index 0000000..19ea048 --- /dev/null +++ b/config_files/tasks/tsinghua_da_head.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google" + ], + "task_id": "tsinghua_da_head", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "帮我查一下清华大学自动化系系主任的邮箱", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "taozhang@tsinghua.edu.cn" + } + } + } \ No newline at end of file diff --git a/config_files/test.raw.json b/config_files/test.raw.json new file mode 100644 index 0000000..fe76d23 --- /dev/null +++ b/config_files/test.raw.json @@ -0,0 +1,29623 @@ +[ + { + "sites": [ + "shopping_admin" + ], + "task_id": 0, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the top-{{n}} best-selling product in {{year}}", + "instantiation_dict": { + "n": 1, + "year": 2022 + }, + "intent": "What is the top-1 best-selling product in 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Quest Lumaflex\u2122 Band" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Quest Lumaflex\u2122 Band" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 1, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the top-{{n}} best-selling brand in {{period}}", + "instantiation_dict": { + "n": 1, + "period": "Quarter 1 2022" + }, + "intent": "What is the top-1 best-selling brand in Quarter 1 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Sprite" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Sprite" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 2, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the top-{{n}} best-selling product type in {{period}}", + "instantiation_dict": { + "n": 1, + "period": "Quarter 1 2022" + }, + "intent": "What is the top-1 best-selling product type in Quarter 1 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Yoga ball" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Yoga ball" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 3, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the top-{{n}} best-selling product in {{year}}", + "instantiation_dict": { + "n": 2, + "year": 2022 + }, + "intent": "What are the top-2 best-selling product in 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Quest Lumaflex\u2122 Band", + "Sprite Stasis Ball 65 cm" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Quest Lumaflex\u2122 Band, Sprite Stasis Ball 65 cm" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 4, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the top-{{n}} best-selling product in {{period}}", + "instantiation_dict": { + "n": 3, + "period": "Jan 2023" + }, + "intent": "What are the top-3 best-selling product in Jan 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Impulse Duffle", + "Overnight Duffle", + "Hawkeye Yoga Short-32-Blue" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Impulse Duffle, Overnight Duffle, Hawkeye Yoga Short-32-Blue" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 5, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the top-{{n}} best-selling product type in {{period}}", + "instantiation_dict": { + "n": 1, + "period": "Jan 2023" + }, + "intent": "What is the top-1 best-selling product type in Jan 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Duffle" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Duffle" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 6, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the top-{{n}} best-selling product in {{year}}", + "instantiation_dict": { + "n": 5, + "year": 2023 + }, + "intent": "What are the top-5 best-selling product in 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Sprite Yoga Strap 6 foot", + "Overnight Duffle", + "Ida Workout Parachute Pant-29-Purple", + "Hawkeye Yoga Short-32-Blue", + "Sprite Stasis Ball 65 cm" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Sprite Yoga Strap 6 foot, Overnight Duffle, Ida Workout Parachute Pant-29-Purple, Hawkeye Yoga Short-32-Blue, Sprite Stasis Ball 65 cm" + }, + "intent_template_id": 279 + }, + { + "sites": [ + "map" + ], + "task_id": 7, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the full address of all {{airport_type}} that are within a driving distance of {{radius}} to {{start}}", + "instantiation_dict": { + "airport_type": "international airports", + "start": "Carnegie Mellon University", + "radius": "50 km" + }, + "intent": "Tell me the full address of all international airports that are within a driving distance of 50 km to Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Pittsburgh International Airport, Southern Beltway, Findlay Township, Allegheny County, 15231, United States" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Pittsburgh International Airport People Movers, Airport Boulevard, Findlay Township, Allegheny County, Pennsylvania, 15231, United States" + }, + "intent_template_id": 79 + }, + { + "sites": [ + "map" + ], + "task_id": 8, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the full address of all {{airport_type}} that are within a driving distance of {{radius}} to {{start}}", + "instantiation_dict": { + "airport_type": "international airports", + "start": "Carnegie Mellon University", + "radius": "5 km" + }, + "intent": "Tell me the full address of all international airports that are within a driving distance of 5 km to Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "There is no airport within 5 km of Carnegie Mellon University" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "There is no airport within 5 km of Carnegie Mellon University" + }, + "intent_template_id": 79 + }, + { + "sites": [ + "map" + ], + "task_id": 9, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the full address of all {{airport_type}} that are within a driving distance of {{radius}} to {{start}}", + "instantiation_dict": { + "airport_type": "international airports", + "start": "Carnegie Art Museum", + "radius": "30 km" + }, + "intent": "Tell me the full address of all international airports that are within a driving distance of 30 km to Carnegie Art Museum", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Pittsburgh International Airport, Southern Beltway, Findlay Township, Allegheny County, 15231, United States" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Pittsburgh International Airport People Movers, Airport Boulevard, Findlay Township, Allegheny County, Pennsylvania, 15231, United States" + }, + "intent_template_id": 79 + }, + { + "sites": [ + "map" + ], + "task_id": 10, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the full address of all {{airport_type}} that are within a driving distance of {{radius}} to {{start}}", + "instantiation_dict": { + "airport_type": "US international airports", + "start": "Niagara Falls", + "radius": "60 km" + }, + "intent": "Tell me the full address of all US international airports that are within a driving distance of 60 km to Niagara Falls", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Niagara Falls International Airport, 2035, Niagara Falls Boulevard, City of Niagara Falls, Town of Wheatfield, Niagara County, New York, 14304, United States", + "Buffalo-Niagara International Airport, Holtz Drive, Town of Cheektowaga, Erie County, New York, 14225, United States" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Niagara Falls International Airport, 2035, Niagara Falls Boulevard, City of Niagara Falls, Town of Wheatfield, Niagara County, New York, 14304, United States Buffalo-Niagara International Airport, South Youngs Road, Town of Cheektowaga, Erie County, New York, 14221, United States" + }, + "intent_template_id": 79 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 11, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the the number of reviews that our store received by far that mention term \"{{term}}\"", + "instantiation_dict": { + "term": "disappointed" + }, + "intent": "Tell me the the number of reviews that our store received by far that mention term \"disappointed\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "6" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "6" + }, + "intent_template_id": 288 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 12, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the the number of reviews that our store received by far that mention term \"{{term}}\"", + "instantiation_dict": { + "term": "satisfied" + }, + "intent": "Tell me the the number of reviews that our store received by far that mention term \"satisfied\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "2" + }, + "intent_template_id": 288 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 13, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the the number of reviews that our store received by far that mention term \"{{term}}\"", + "instantiation_dict": { + "term": "decent" + }, + "intent": "Tell me the the number of reviews that our store received by far that mention term \"decent\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "2" + }, + "intent_template_id": 288 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 14, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the the number of reviews that our store received by far that mention term \"{{term}}\"", + "instantiation_dict": { + "term": "not useful" + }, + "intent": "Tell me the the number of reviews that our store received by far that mention term \"not useful\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 288 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 15, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the the number of reviews that our store received by far that mention term \"{{term}}\"", + "instantiation_dict": { + "term": "best" + }, + "intent": "Tell me the the number of reviews that our store received by far that mention term \"best\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "2" + }, + "intent_template_id": 288 + }, + { + "sites": [ + "map" + ], + "task_id": 16, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Compare the time for walking and driving route from {{start}} to {{end}}", + "instantiation_dict": { + "start": "5000 Fifth Avenue, Pittsburgh", + "end": "UPMC family health center" + }, + "intent": "Compare the time for walking and driving route from 5000 Fifth Avenue, Pittsburgh to UPMC family health center", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "driving: 2min; walking: 16min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Driving: 2min. Walking: 16min." + }, + "intent_template_id": 73 + }, + { + "sites": [ + "map" + ], + "task_id": 17, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Compare the time for walking and driving route from {{start}} to {{end}}", + "instantiation_dict": { + "start": "AMC Waterfront", + "end": "Carnegie Mellon University" + }, + "intent": "Compare the time for walking and driving route from AMC Waterfront to Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "driving: 13min; walking: 1h 35min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "driving: 13min, walking: 1h 35min." + }, + "intent_template_id": 73 + }, + { + "sites": [ + "map" + ], + "task_id": 18, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Compare the time for walking and driving route from {{start}} to {{end}}", + "instantiation_dict": { + "start": "AMC Waterfront", + "end": "Univ of Pittsburgh" + }, + "intent": "Compare the time for walking and driving route from AMC Waterfront to Univ of Pittsburgh", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "driving: 15min; walking: 1h 47min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "driving: 15min, walking: 1h 47min." + }, + "intent_template_id": 73 + }, + { + "sites": [ + "map" + ], + "task_id": 19, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Compare the time for walking and driving route from {{start}} to {{end}}", + "instantiation_dict": { + "start": "Carnegie Science Center", + "end": "Carnegie Mellon University" + }, + "intent": "Compare the time for walking and driving route from Carnegie Science Center to Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "driving: 12min; walking: 1h 44min." + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "driving: 12min, walking: 1h 44min." + }, + "intent_template_id": 73 + }, + { + "sites": [ + "map" + ], + "task_id": 20, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Compare the difference in time for walking and driving route from {{start}} to {{end}}", + "instantiation_dict": { + "start": "Randyland", + "end": "Carnegie Mellon University" + }, + "intent": "Compare the difference in time for walking and driving route from Randyland to Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "driving: 13min; walking: 1h 45min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "driving: 13min, walking: 1h 45min." + }, + "intent_template_id": 73 + }, + { + "sites": [ + "shopping" + ], + "task_id": 21, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/6s-wireless-headphones-over-ear-noise-canceling-hi-fi-bass-foldable-stereo-wireless-kid-headsets-earbuds-with-built-in-mic-micro-sd-tf-fm-for-iphone-samsung-ipad-pc-black-gold.html", + "geolocation": null, + "intent_template": "List out reviewers, if exist, who mention about {{description}}", + "instantiation_dict": { + "description": "ear cups being small" + }, + "intent": "List out reviewers, if exist, who mention about ear cups being small", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Joseph Brzezinski", + "Catso", + "Dibbins", + "Anglebert Dinkherhump", + "Michelle Davis" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Joseph Brzezinski, Catso, Dibbins, Anglebert Dinkherhump, Michelle Davis" + }, + "intent_template_id": 222 + }, + { + "sites": [ + "shopping" + ], + "task_id": 22, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/fujifilm-finepix-z200fd-10mp-digital-camera-with-5x-optical-dual-image-stabilized-zoom-black.html", + "geolocation": null, + "intent_template": "List out reviewers, if exist, who mention about {{description}}", + "instantiation_dict": { + "description": "under water photo" + }, + "intent": "List out reviewers, if exist, who mention about under water photo", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no review about under water photo", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 222 + }, + { + "sites": [ + "shopping" + ], + "task_id": 23, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/3-pack-samsung-galaxy-s6-screen-protector-nearpow-tempered-glass-screen-protector-with-9h-hardness-crystal-clear-easy-bubble-free-installation-scratch-resist.html", + "geolocation": null, + "intent_template": "List out reviewers, if exist, who mention about {{description}}", + "instantiation_dict": { + "description": "good fingerprint resistant" + }, + "intent": "List out reviewers, if exist, who mention about good fingerprint resistant", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Rachel", + "T. Gannon" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Rachel, T. Gannon, " + }, + "intent_template_id": 222 + }, + { + "sites": [ + "shopping" + ], + "task_id": 24, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/haflinger-men-s-wool-felt-open-back-slippers-beige-550-peat-us-7.html", + "geolocation": null, + "intent_template": "List out reviewers, if exist, who mention about {{description}}", + "instantiation_dict": { + "description": "price being unfair" + }, + "intent": "List out reviewers, if exist, who mention about price being unfair", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no reivew about price being unfair", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 222 + }, + { + "sites": [ + "shopping" + ], + "task_id": 25, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/epson-workforce-wf-3620-wifi-direct-all-in-one-color-inkjet-printer-copier-scanner-amazon-dash-replenishment-ready.html", + "geolocation": null, + "intent_template": "List out reviewers, if exist, who mention about {{description}}", + "instantiation_dict": { + "description": "average print quality" + }, + "intent": "List out reviewers, if exist, who mention about average print quality", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Goldfish", + "Roxanne Brandon Coffey" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "GoldfishGoldfish, Roxanne Brandon Coffey" + }, + "intent_template_id": 222 + }, + { + "sites": [ + "shopping" + ], + "task_id": 26, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/epson-workforce-wf-3620-wifi-direct-all-in-one-color-inkjet-printer-copier-scanner-amazon-dash-replenishment-ready.html", + "geolocation": null, + "intent_template": "List out reviewers, if exist, who mention about {{description}}", + "instantiation_dict": { + "description": "complain of the customer service" + }, + "intent": "List out reviewers, if exist, who mention about complain of the customer service", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Bob in Vegas", + "RemyR" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Bob in Vegas, RemyRRemyR" + }, + "intent_template_id": 222 + }, + { + "sites": [ + "reddit" + ], + "task_id": 27, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the {{forum}} forum.", + "instantiation_dict": { + "forum": "Showerthoughts" + }, + "intent": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the Showerthoughts forum.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 33 + }, + { + "sites": [ + "reddit" + ], + "task_id": 28, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the {{forum}} forum.", + "instantiation_dict": { + "forum": "Worcester" + }, + "intent": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the Worcester forum.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 33 + }, + { + "sites": [ + "reddit" + ], + "task_id": 29, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the {{forum}} forum.", + "instantiation_dict": { + "forum": "DIY" + }, + "intent": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the DIY forum.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1" + }, + "intent_template_id": 33 + }, + { + "sites": [ + "reddit" + ], + "task_id": 30, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the {{forum}} forum.", + "instantiation_dict": { + "forum": "space" + }, + "intent": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the space forum.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 33 + }, + { + "sites": [ + "reddit" + ], + "task_id": 31, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the {{forum}} forum.", + "instantiation_dict": { + "forum": "photoshopbattles" + }, + "intent": "Tell me the count of comments that have received more downvotes than upvotes for the user who made the latest post on the photoshopbattles forum.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 33 + }, + { + "sites": [ + "map" + ], + "task_id": 32, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I will arrive {{place}} soon. Provide the name of a {{target1}} in the vicinity, if available. Then, tell me the {{information}} to {{target2}} from the hotel.", + "instantiation_dict": { + "place": "Pittsburgh Airport", + "information": "the walking distance", + "target1": "Hilton hotel", + "target2": "the nearest supermarket own by a local company" + }, + "intent": "I will arrive Pittsburgh Airport soon. Provide the name of a Hilton hotel in the vicinity, if available. Then, tell me the the walking distance to the nearest supermarket own by a local company from the hotel.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "DoubleTree by Hilton Hotel Pittsburgh Airport", + "2.0km" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "DoubleTree by Hilton Hotel Pittsburgh Airport Distance: 2.0km" + }, + "intent_template_id": 78 + }, + { + "sites": [ + "map" + ], + "task_id": 33, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I will arrive {{place}} soon. Provide the name of a {{target1}} in the vicinity, if available. Then, tell me the {{information}} to {{target2}} from the hotel.", + "instantiation_dict": { + "place": "Pittsburgh Airport", + "target1": "Hilton hotel", + "information": "the shortest walking distance", + "target2": "a supermarket" + }, + "intent": "I will arrive Pittsburgh Airport soon. Provide the name of a Hilton hotel in the vicinity, if available. Then, tell me the the shortest walking distance to a supermarket from the hotel.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "DoubleTree by Hilton Hotel Pittsburgh Airport", + "1.4km" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "DoubleTree by Hilton Hotel Pittsburgh Airport Distance: 1.4km" + }, + "intent_template_id": 78 + }, + { + "sites": [ + "map" + ], + "task_id": 34, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I will arrive {{place}} soon. Provide the name of a {{target1}} in the vicinity, if available. Then, tell me the {{information}} to {{target2}} from the hotel.", + "instantiation_dict": { + "place": "Pittsburgh Airport", + "target1": "Hyatt hotel", + "information": "the shortest walking time", + "target2": "a supermarket" + }, + "intent": "I will arrive Pittsburgh Airport soon. Provide the name of a Hyatt hotel in the vicinity, if available. Then, tell me the the shortest walking time to a supermarket from the hotel.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Hyatt Regency Pittsburgh International Airport" + ], + "fuzzy_match": [ + "Time: 3h 30min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Hyatt Regency Pittsburgh International Airport\n3:30" + }, + "intent_template_id": 78 + }, + { + "sites": [ + "map" + ], + "task_id": 35, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I will arrive {{place}} soon. Provide the name of a {{target1}} in the vicinity, if available. Then, tell me the {{information}} to {{target2}} from the hotel.", + "instantiation_dict": { + "place": "Pittsburgh Airport", + "target1": "Hyatt hotel", + "information": "the minimal driving time", + "target2": "a supermarket" + }, + "intent": "I will arrive Pittsburgh Airport soon. Provide the name of a Hyatt hotel in the vicinity, if available. Then, tell me the the minimal driving time to a supermarket from the hotel.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Hyatt Regency Pittsburgh International Airport" + ], + "fuzzy_match": [ + "Time: 15min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Hyatt Regency Pittsburgh International Airport Time: 15min" + }, + "intent_template_id": 78 + }, + { + "sites": [ + "map" + ], + "task_id": 36, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Check if the {{place}} in pittsburgh can be reached in one hour by car from {{location}}", + "instantiation_dict": { + "place": "social security administration", + "location": "Carnegie Mellon University" + }, + "intent": "Check if the social security administration in pittsburgh can be reached in one hour by car from Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Yes"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Yes" + }, + "intent_template_id": 77 + }, + { + "sites": [ + "map" + ], + "task_id": 37, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Check if the {{place}} in pittsburgh can be reached in one hour by car from {{location}}", + "instantiation_dict": { + "place": "police station", + "location": "gates building at CMU" + }, + "intent": "Check if the police station in pittsburgh can be reached in one hour by car from gates building at CMU", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Yes"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Yes" + }, + "intent_template_id": 77 + }, + { + "sites": [ + "map" + ], + "task_id": 38, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Check if the {{place}} in pittsburgh can be reached in one hour by car from {{location}}", + "instantiation_dict": { + "place": "duquesne university", + "location": "pittsburgh airport" + }, + "intent": "Check if the duquesne university in pittsburgh can be reached in one hour by car from pittsburgh airport", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Yes"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Yes" + }, + "intent_template_id": 77 + }, + { + "sites": [ + "map" + ], + "task_id": 39, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Check if the {{place}} in pittsburgh can be reached in one hour by car from {{location}}", + "instantiation_dict": { + "place": "walmart", + "location": "5600 fifth avenue" + }, + "intent": "Check if the walmart in pittsburgh can be reached in one hour by car from 5600 fifth avenue", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Yes"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Yes" + }, + "intent_template_id": 77 + }, + { + "sites": [ + "map" + ], + "task_id": 40, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Check if the {{place}} in pittsburgh can be reached in one hour by car from {{location}}", + "instantiation_dict": { + "place": "amc theatre", + "location": "hobart street" + }, + "intent": "Check if the amc theatre in pittsburgh can be reached in one hour by car from hobart street", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Yes"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Yes" + }, + "intent_template_id": 77 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 41, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "List the top {{n}} search terms in my store", + "instantiation_dict": { + "n": "1" + }, + "intent": "List the top 1 search terms in my store", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "hollister" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "hollister" + }, + "intent_template_id": 285 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 42, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "List the top {{n}} search terms in my store", + "instantiation_dict": { + "n": "2" + }, + "intent": "List the top 2 search terms in my store", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "hollister", + "Joust Bag" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "hollister, Joust Bag" + }, + "intent_template_id": 285 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 43, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "List the top {{n}} search terms in my store", + "instantiation_dict": { + "n": "3" + }, + "intent": "List the top 3 search terms in my store", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "hollister", + "Joust Bag", + "Antonia Racer Tank" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "hollister, Joust Bag, Antonia Race Tank" + }, + "intent_template_id": 285 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 44, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Check out my todos", + "instantiation_dict": {}, + "intent": "Check out my todos", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/dashboard/todos", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 303 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 45, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "Check out the most recent open issues", + "instantiation_dict": {}, + "intent": "Check out the most recent open issues", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues/?sort=created_asc&state=opened", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 300 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 46, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Check out the most recent open issues", + "instantiation_dict": {}, + "intent": "Check out the most recent open issues", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/issues/?sort=created_date&state=opened", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 300 + }, + { + "sites": [ + "shopping" + ], + "task_id": 47, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Today is 6/12/2023. Tell me how many fulfilled orders I have {{period}}, and the total amount of money I spent.", + "instantiation_dict": { + "period": "over the past month" + }, + "intent": "Today is 6/12/2023. Tell me how many fulfilled orders I have over the past month, and the total amount of money I spent.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "0 order", + "$0 total spend" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0 order, $0 total spend" + }, + "intent_template_id": 197 + }, + { + "sites": [ + "shopping" + ], + "task_id": 48, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Today is 6/12/2023. Tell me how many fulfilled orders I have {{period}}, and the total amount of money I spent.", + "instantiation_dict": { + "period": "over the past three days" + }, + "intent": "Today is 6/12/2023. Tell me how many fulfilled orders I have over the past three days, and the total amount of money I spent.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "0 order", + "$0 total spend" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0 order, $0 total spend" + }, + "intent_template_id": 197 + }, + { + "sites": [ + "shopping" + ], + "task_id": 49, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Today is 6/12/2023. Tell me how many fulfilled orders I have {{period}}, and the total amount of money I spent.", + "instantiation_dict": { + "period": "over the past four month" + }, + "intent": "Today is 6/12/2023. Tell me how many fulfilled orders I have over the past four month, and the total amount of money I spent.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "3 orders", + "$845.49 total spend" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "3 orders, $845.49 total spend" + }, + "intent_template_id": 197 + }, + { + "sites": [ + "shopping" + ], + "task_id": 50, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Today is 6/12/2023. Tell me how many fulfilled orders I have {{period}}, and the total amount of money I spent.", + "instantiation_dict": { + "period": "over the past year" + }, + "intent": "Today is 6/12/2023. Tell me how many fulfilled orders I have over the past year, and the total amount of money I spent.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "24 orders", + "$6560.69 total spend" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "24 orders, $6560.69 total spend" + }, + "intent_template_id": 197 + }, + { + "sites": [ + "shopping" + ], + "task_id": 51, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Today is 6/12/2023. Tell me how many fulfilled orders I have {{period}}, and the total amount of money I spent.", + "instantiation_dict": { + "period": "over the past six month" + }, + "intent": "Today is 6/12/2023. Tell me how many fulfilled orders I have over the past six month, and the total amount of money I spent.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "12 orders", + "$1603.69 total spend" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "12 orders, $1603.69 total spend" + }, + "intent_template_id": 197 + }, + { + "sites": [ + "map" + ], + "task_id": 52, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "How long does it take to walk from {{start}} to {{end}}?", + "instantiation_dict": { + "start": "Carnegie Mellon University", + "end": "starbucks on Craig Street" + }, + "intent": "How long does it take to walk from Carnegie Mellon University to starbucks on Craig Street?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "7 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "7 min" + }, + "intent_template_id": 68 + }, + { + "sites": [ + "map" + ], + "task_id": 53, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "How long does it take to walk from {{start}} to {{end}}?", + "instantiation_dict": { + "start": "Univ of Pittsburgh", + "end": "starbucks on Craig Street" + }, + "intent": "How long does it take to walk from Univ of Pittsburgh to starbucks on Craig Street?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "18 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "18 min" + }, + "intent_template_id": 68 + }, + { + "sites": [ + "map" + ], + "task_id": 54, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "How long does it take to walk from {{start}} to {{end}}?", + "instantiation_dict": { + "start": "Carnegie Mellon University", + "end": "Univ of Pittsburgh" + }, + "intent": "How long does it take to walk from Carnegie Mellon University to Univ of Pittsburgh?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "25 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "25 min" + }, + "intent_template_id": 68 + }, + { + "sites": [ + "map" + ], + "task_id": 55, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "How long does it take to walk from {{start}} to {{end}}?", + "instantiation_dict": { + "start": "the starbuck near CMU", + "end": "Chatham university" + }, + "intent": "How long does it take to walk from the starbuck near CMU to Chatham university?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "30 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "30 min" + }, + "intent_template_id": 68 + }, + { + "sites": [ + "map" + ], + "task_id": 56, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "How long does it take to walk from {{start}} to {{end}}?", + "instantiation_dict": { + "start": "Carnegie Museum of Art", + "end": "a library at CMU" + }, + "intent": "How long does it take to walk from Carnegie Museum of Art to a library at CMU?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "11 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "11 min" + }, + "intent_template_id": 68 + }, + { + "sites": [ + "map" + ], + "task_id": 57, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the closest {{place1}}(s) to {{place2}}", + "instantiation_dict": { + "place1": "restaurant", + "place2": "university center at Carnegie Mellon University" + }, + "intent": "Tell me the closest restaurant(s) to university center at Carnegie Mellon University", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "El Gallo de Oro", + "Back Bar Grill", + "Grano", + "Beefsteak", + "Nourish", + "Schatz Dining Room", + "Au Bon Pain" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "El Gallo de Oro, Back Bar Grill, Grano, Beefsteak, Nourish, Schatz Dining Room, Au Bon Pain" + }, + "intent_template_id": 69 + }, + { + "sites": [ + "map" + ], + "task_id": 58, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the closest {{place1}}(s) to {{place2}}", + "instantiation_dict": { + "place1": "cafe", + "place2": "CMU Hunt library" + }, + "intent": "Tell me the closest cafe(s) to CMU Hunt library", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "De Fer Coffee & Tea" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "De Fer Coffee & Tea" + }, + "intent_template_id": 69 + }, + { + "sites": [ + "map" + ], + "task_id": 59, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the closest {{place1}}(s) to {{place2}}", + "instantiation_dict": { + "place1": "restaurant", + "place2": "CMU Hunt library" + }, + "intent": "Tell me the closest restaurant(s) to CMU Hunt library", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "The exchange" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "The exchange" + }, + "intent_template_id": 69 + }, + { + "sites": [ + "map" + ], + "task_id": 60, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the closest {{place1}}(s) to {{place2}}", + "instantiation_dict": { + "place1": "restaurant", + "place2": "CMU Posner Hall" + }, + "intent": "Tell me the closest restaurant(s) to CMU Posner Hall", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "The exchange" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "The exchange" + }, + "intent_template_id": 69 + }, + { + "sites": [ + "map" + ], + "task_id": 61, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the closest {{place1}}(s) to {{place2}}", + "instantiation_dict": { + "place1": "restaurant", + "place2": "CMU Sorrells Library" + }, + "intent": "Tell me the closest restaurant(s) to CMU Sorrells Library", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "La Prima Espresso" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "La Prima Espresso" + }, + "intent_template_id": 69 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 62, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Which customer has completed the {{quantifier}} number of orders in the entire history?", + "instantiation_dict": { + "quantifier": "most" + }, + "intent": "Which customer has completed the most number of orders in the entire history?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Jane Smith" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Jane Smith" + }, + "intent_template_id": 276 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 63, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Which customer(s) has completed the {{quantifier}} number of orders in the entire history?", + "instantiation_dict": { + "quantifier": "second most" + }, + "intent": "Which customer(s) has completed the second most number of orders in the entire history?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Adam Garcia", + "Michael Nguyen", + "Sarah Miller" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Adam Garcia, Michael Nguyen, Sarah Miller" + }, + "intent_template_id": 276 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 64, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Which customer has placed {{number}} orders in the entire history?", + "instantiation_dict": { + "number": "2" + }, + "intent": "Which customer has placed 2 orders in the entire history?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Lisa Kim", + "Lisa Green", + "Julia Williams", + "Brian Smith", + "Alexander Thomas" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Lisa Kim, Lisa Green, Julia Williams, Brian Smith, Alexander Thomas" + }, + "intent_template_id": 276 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 65, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Which customer has completed the {{quantifier}} number of orders in the entire history?", + "instantiation_dict": { + "quantifier": "fifth most" + }, + "intent": "Which customer has completed the fifth most number of orders in the entire history?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Jane Doe" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Jane Doe" + }, + "intent_template_id": 276 + }, + { + "sites": [ + "reddit" + ], + "task_id": 66, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Among the top {{number}} post in \"{{subreddit}}\" forum, {{description}}", + "instantiation_dict": { + "number": 10, + "subreddit": "books", + "description": "show me the post URLs that recommand a single book" + }, + "intent": "Among the top 10 post in \"books\" forum, show me the post URLs that recommand a single book", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "http://www.reddit.com/f/books/59396/apple-books-has-a-free-audiobook-of-a-christmas-carol", + "http://www.reddit.com/f/books/17445/i-just-finished-reading-the-hobbit-to-my-6-year-old-daughter" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "__REDDIT__/f/books/59396/apple-books-has-a-free-audiobook-of-a-christmas-carol, __REDDIT__/f/books/17445/i-just-finished-reading-the-hobbit-to-my-6-year-old-daughter" + }, + "intent_template_id": 17 + }, + { + "sites": [ + "reddit" + ], + "task_id": 67, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Among the top {{number}} post in \"{{subreddit}}\" forum, {{description}}", + "instantiation_dict": { + "number": 10, + "subreddit": "books", + "description": "show me the book names from posts that recommand a single book" + }, + "intent": "Among the top 10 post in \"books\" forum, show me the book names from posts that recommand a single book", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "A Christmas Carol", + "The Hobbit" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "A Christmas Carol, The Hobbit" + }, + "intent_template_id": 17 + }, + { + "sites": [ + "reddit" + ], + "task_id": 68, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Among the top {{number}} post in \"{{subreddit}}\" forum, {{description}}", + "instantiation_dict": { + "number": 10, + "subreddit": "books", + "description": "show me the author name and the book name from posts that recommand a single book" + }, + "intent": "Among the top 10 post in \"books\" forum, show me the author name and the book name from posts that recommand a single book", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "A Christmas Carol", + "Levar Burton", + "The Hobbit", + "J. R. R. Tolkien" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "A Christmas Carol by Levar Burton: , The Hobbit by J. R. R. Tolkien" + }, + "intent_template_id": 17 + }, + { + "sites": [ + "reddit" + ], + "task_id": 69, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Among the top {{number}} post in \"{{subreddit}}\" forum, {{description}}", + "instantiation_dict": { + "number": 10, + "subreddit": "books", + "description": "is there any post talks about supporting local book stores? If so, tell me the organizations involved" + }, + "intent": "Among the top 10 post in \"books\" forum, is there any post talks about supporting local book stores? If so, tell me the organizations involved", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "bookshop.org" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "bookshop.org" + }, + "intent_template_id": 17 + }, + { + "sites": [ + "map" + ], + "task_id": 70, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the zip code of {{place}}?", + "instantiation_dict": { + "place": "Carnegie Mellon University" + }, + "intent": "What is the zip code of Carnegie Mellon University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "15213" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "15213" + }, + "intent_template_id": 70 + }, + { + "sites": [ + "map" + ], + "task_id": 71, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the zip code of {{place}}?", + "instantiation_dict": { + "place": "Chatham University" + }, + "intent": "What is the zip code of Chatham University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "15232" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "15232" + }, + "intent_template_id": 70 + }, + { + "sites": [ + "map" + ], + "task_id": 72, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the zip code of {{place}}?", + "instantiation_dict": { + "place": "Yale University" + }, + "intent": "What is the zip code of Yale University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "06516" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "06516" + }, + "intent_template_id": 70 + }, + { + "sites": [ + "map" + ], + "task_id": 73, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the zip code of {{place}}?", + "instantiation_dict": { + "place": "Columbia University" + }, + "intent": "What is the zip code of Columbia University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "10027" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "10027" + }, + "intent_template_id": 70 + }, + { + "sites": [ + "map" + ], + "task_id": 74, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Given the following locations, {{place_list}}, what would be the optimal route to travel through them all in order to minimize total travel time? Please note the journey begins at the first place listed.", + "instantiation_dict": { + "place_list": [ + "Carnegie Mellon University", + "apple store shadyside", + "starbucks on craig street" + ] + }, + "intent": "Given the following locations, ['Carnegie Mellon University', 'apple store shadyside', 'starbucks on craig street'], what would be the optimal route to travel through them all in order to minimize total travel time? Please note the journey begins at the first place listed.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "The order is Carnegie Mellon University, starbucks on forbes ave, apple store shadyside" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Carnegie Mellon University, starbucks on forbes ave, apple store shadyside" + }, + "intent_template_id": 65 + }, + { + "sites": [ + "map" + ], + "task_id": 75, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Given the following locations, {{place_list}}, what would be the optimal route to travel through them all in order to minimize total travel time? Please note the journey begins at the first place listed.", + "instantiation_dict": { + "place_list": [ + "Massachusetts Institute of Technology", + "Harvard University", + "Boston Logan International Airport" + ] + }, + "intent": "Given the following locations, ['Massachusetts Institute of Technology', 'Harvard University', 'Boston Logan International Airport'], what would be the optimal route to travel through them all in order to minimize total travel time? Please note the journey begins at the first place listed.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "The order is Massachusetts Institute of Technology, Harvard University, Boston Logan International Airport" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Massachusetts Institute of Technology, Harvard University, Boston Logan International Airport" + }, + "intent_template_id": 65 + }, + { + "sites": [ + "map" + ], + "task_id": 76, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Given the following locations, {{place_list}}, what would be the optimal route to travel through them all in order to minimize total travel time? Please note the journey begins at the first place listed.", + "instantiation_dict": { + "place_list": [ + "Princeton University", + "Yale University", + "Harvard University" + ] + }, + "intent": "Given the following locations, ['Princeton University', 'Yale University', 'Harvard University'], what would be the optimal route to travel through them all in order to minimize total travel time? Please note the journey begins at the first place listed.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "The order is Princeton University, Yale University, Harvard University" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Princeton University, Yale University, Harvard University" + }, + "intent_template_id": 65 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 77, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the total count of {{status}} reviews amongst all the reviews?", + "instantiation_dict": { + "status": "Pending" + }, + "intent": "What is the total count of Pending reviews amongst all the reviews?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "5" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "5" + }, + "intent_template_id": 277 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 78, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the total count of {{status}} reviews amongst all the reviews?", + "instantiation_dict": { + "status": "Approved" + }, + "intent": "What is the total count of Approved reviews amongst all the reviews?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "346" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "346" + }, + "intent_template_id": 277 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 79, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What is the total count of {{status}} reviews amongst all the reviews?", + "instantiation_dict": { + "status": "Not Approved" + }, + "intent": "What is the total count of Not Approved reviews amongst all the reviews?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 277 + }, + { + "sites": [ + "map" + ], + "task_id": 80, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the duration required to first walk from {{place_A}} to {{place_B}}, and then drive to {{place_C}}?", + "instantiation_dict": { + "place_A": "Carnegie Mellon University", + "place_B": "Starbucks on Craig Street", + "place_C": "Pittsburgh International Airport" + }, + "intent": "What is the duration required to first walk from Carnegie Mellon University to Starbucks on Craig Street, and then drive to Pittsburgh International Airport?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "38 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "38 min" + }, + "intent_template_id": 72 + }, + { + "sites": [ + "map" + ], + "task_id": 81, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the duration required to first walk from {{place_A}} to {{place_B}}, and then drive to {{place_C}}?", + "instantiation_dict": { + "place_A": "Univ of Pittsburgh", + "place_B": "starbucks on Craig Street", + "place_C": "Pittsburgh International Airport" + }, + "intent": "What is the duration required to first walk from Univ of Pittsburgh to starbucks on Craig Street, and then drive to Pittsburgh International Airport?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "49 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "49 min" + }, + "intent_template_id": 72 + }, + { + "sites": [ + "map" + ], + "task_id": 82, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the duration required to first walk from {{place_A}} to {{place_B}}, and then drive to {{place_C}}?", + "instantiation_dict": { + "place_A": "Massachusetts Institute of Technology", + "place_B": "Harvard University", + "place_C": "Boston Logan International Airport" + }, + "intent": "What is the duration required to first walk from Massachusetts Institute of Technology to Harvard University, and then drive to Boston Logan International Airport?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "63 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "63 min" + }, + "intent_template_id": 72 + }, + { + "sites": [ + "map" + ], + "task_id": 83, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the duration required to first walk from {{place_A}} to {{place_B}}, and then drive to {{place_C}}?", + "instantiation_dict": { + "place_A": "Carnegie Mellon University", + "place_B": "apple store shadyside", + "place_C": "starbucks on craig street" + }, + "intent": "What is the duration required to first walk from Carnegie Mellon University to apple store shadyside, and then drive to starbucks on craig street?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "22 min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "22 min" + }, + "intent_template_id": 72 + }, + { + "sites": [ + "map" + ], + "task_id": 84, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "From my stay at {{hotel}}, what's the estimated driving time to reach {{place}}?", + "instantiation_dict": { + "hotel": "DoubleTree by Hilton New York Downtown", + "place": "Keens Steakhouse" + }, + "intent": "From my stay at DoubleTree by Hilton New York Downtown, what's the estimated driving time to reach Keens Steakhouse?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "14 minutes" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "14 minutes" + }, + "intent_template_id": 64 + }, + { + "sites": [ + "map" + ], + "task_id": 85, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "From my stay at {{hotel}}, what's the estimated driving time to reach {{place}}?", + "instantiation_dict": { + "hotel": "La Quinta Inn near the airport", + "place": "Carnegie Mellon University" + }, + "intent": "From my stay at La Quinta Inn near the airport, what's the estimated driving time to reach Carnegie Mellon University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "30 minutes" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "30 minutes" + }, + "intent_template_id": 64 + }, + { + "sites": [ + "map" + ], + "task_id": 86, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "From my stay at {{hotel}}, what's the estimated driving time to reach {{place}}?", + "instantiation_dict": { + "hotel": "La Quinta Inn near the airport", + "place": "Upitt" + }, + "intent": "From my stay at La Quinta Inn near the airport, what's the estimated driving time to reach Upitt?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "29 minutes" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "29 minutes" + }, + "intent_template_id": 64 + }, + { + "sites": [ + "map" + ], + "task_id": 87, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "From my stay at {{hotel}}, what's the estimated driving time to reach {{place}}?", + "instantiation_dict": { + "hotel": "red roof inn", + "place": "Pittsburgh science museum" + }, + "intent": "From my stay at red roof inn, what's the estimated driving time to reach Pittsburgh science museum?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "20 minutes" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "20 minutes" + }, + "intent_template_id": 64 + }, + { + "sites": [ + "map" + ], + "task_id": 88, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "From my stay at {{hotel}}, what's the estimated driving time to reach {{place}}?", + "instantiation_dict": { + "hotel": "Homewood Suites Southpointe", + "place": "PPG Paints Arena" + }, + "intent": "From my stay at Homewood Suites Southpointe, what's the estimated driving time to reach PPG Paints Arena?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "34 minutes" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "34 minutes" + }, + "intent_template_id": 64 + }, + { + "sites": [ + "map" + ], + "task_id": 89, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Which US states border {{state}}?", + "instantiation_dict": { + "state": "Connecticut" + }, + "intent": "Which US states border Connecticut?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Rhode Island", + "Massachusetts", + "New York" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Rhode Island, Massachusetts, New York" + }, + "intent_template_id": 67 + }, + { + "sites": [ + "map" + ], + "task_id": 90, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Which US states border {{state}}?", + "instantiation_dict": { + "state": "Pennsylvania" + }, + "intent": "Which US states border Pennsylvania?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Ohio", + "Maryland", + "New York", + "New Jersey", + "Delaware", + "West Virginia" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Ohio, Maryland, New York, New Jersey, Delaware, West Virginia" + }, + "intent_template_id": 67 + }, + { + "sites": [ + "map" + ], + "task_id": 91, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Which US states border {{state}}?", + "instantiation_dict": { + "state": "Massachusetts" + }, + "intent": "Which US states border Massachusetts?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Rhode Island", + "Connecticut", + "New York", + "New Hampshire", + "Vermont" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Rhode Island, Connecticut, New York, New Hampshire, Vermont" + }, + "intent_template_id": 67 + }, + { + "sites": [ + "map" + ], + "task_id": 92, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Which US states border {{state}}?", + "instantiation_dict": { + "state": "Vermont" + }, + "intent": "Which US states border Vermont?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "New York", + "New Hampshire", + "Massachusetts" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "New York, New Hampshire, Massachusetts" + }, + "intent_template_id": 67 + }, + { + "sites": [ + "map" + ], + "task_id": 93, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Which US states border {{state}}?", + "instantiation_dict": { + "state": "New Hampshire" + }, + "intent": "Which US states border New Hampshire?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Massachusetts", + "Vermont", + "Maine" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Massachusetts, Vermont, Maine" + }, + "intent_template_id": 67 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 94, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Telll me the grand total of invoice {{id}}.", + "instantiation_dict": { + "id": "000000001" + }, + "intent": "Telll me the grand total of invoice 000000001.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "36.39" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$36.39" + }, + "intent_template_id": 274 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 95, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Telll me the grand total of invoice {{id}}.", + "instantiation_dict": { + "id": "000000002" + }, + "intent": "Telll me the grand total of invoice 000000002.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "39.64" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$39.64" + }, + "intent_template_id": 274 + }, + { + "sites": [ + "shopping" + ], + "task_id": 96, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me the status of my latest order and when will it arrive", + "instantiation_dict": {}, + "intent": "Tell me the status of my latest order and when will it arrive", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "The last order was canceled. It will never arrive." + ] + }, + "reference_url": "", + "program_html": [], + "reference_answer_raw_annotation": "The last order was canceled. It will never arrive.", + "string_note": "" + }, + "intent_template_id": 193 + }, + { + "sites": [ + "map", + "wikipedia" + ], + "task_id": 97, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the distance to drive from Carnegie Mellon University to the top computer science school in massachusetts", + "instantiation_dict": {}, + "intent": "Tell me the distance to drive from Carnegie Mellon University to the top computer science school in massachusetts", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "914km |OR| 914 km" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "914 km" + }, + "intent_template_id": 120 + }, + { + "sites": [ + "map" + ], + "task_id": 98, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Where is the nearest {{places}} to {{start}}, and what is the walking distance to it?", + "instantiation_dict": { + "places": "tea cafe", + "start": "University of Pittsburgh" + }, + "intent": "Where is the nearest tea cafe to University of Pittsburgh, and what is the walking distance to it?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Fuku Tea", + "3716", + "Forbes Avenue", + "Central Oakland", + "Pittsburgh", + "653m" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Fuku Tea, 3716, Forbes Avenue, Oakland, Central Oakland, Pittsburgh, Allegheny County, Pennsylvania, 15213, United States\n653m" + }, + "intent_template_id": 66 + }, + { + "sites": [ + "map" + ], + "task_id": 99, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Where is the nearest {{places}} to {{start}}, and what is the walking distance to it?", + "instantiation_dict": { + "places": "Five Guys", + "start": "5700 Penn Ave" + }, + "intent": "Where is the nearest Five Guys to 5700 Penn Ave, and what is the walking distance to it?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Five Guys", + "117", + "South Bouquet Street", + "North Oakland", + "Pittsburgh", + "4.0km" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Five Guys, 117, South Bouquet Street, Oakland, North Oakland, Pittsburgh, Allegheny County, Pennsylvania, 15213, United States\n4.0km" + }, + "intent_template_id": 66 + }, + { + "sites": [ + "map" + ], + "task_id": 100, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Where is the nearest {{places}} to {{start}}, and what is the walking distance to it?", + "instantiation_dict": { + "places": "Starbucks", + "start": "Carnegie Mellon" + }, + "intent": "Where is the nearest Starbucks to Carnegie Mellon, and what is the walking distance to it?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Starbucks", + "417", + "South Craig Street", + "Bellefield", + "Pittsburgh", + "557m" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Starbucks, 417, South Craig Street, Bellefield, Pittsburgh, Allegheny County, Pennsylvania, 15213, United States\n557m" + }, + "intent_template_id": 66 + }, + { + "sites": [ + "map" + ], + "task_id": 101, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Where is the nearest {{places}} to {{start}}, and what is the walking distance to it?", + "instantiation_dict": { + "places": "In-N-Out", + "start": "Upitts" + }, + "intent": "Where is the nearest In-N-Out to Upitts, and what is the walking distance to it?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no In-N-Out near University of Pittsburgh", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 66 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 102, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Display the list of issues in the {{repo}} repository that have labels related to {{label}}", + "instantiation_dict": { + "label": "help needed", + "repo": "a11yproject/a11yproject.com" + }, + "intent": "Display the list of issues in the a11yproject/a11yproject.com repository that have labels related to help needed", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/a11y-syntax-highlighting/-/issues/?label_name%5B%5D=help%20wanted", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 349 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 103, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Display the list of issues in the {{repo}} repository that have labels related to {{label}}", + "instantiation_dict": { + "label": "questions", + "repo": "kkroening/ffmpeg-python" + }, + "intent": "Display the list of issues in the kkroening/ffmpeg-python repository that have labels related to questions", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/kkroening/ffmpeg-python/-/issues/?label_name%5B%5D=question", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 349 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 104, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Display the list of issues in the {{repo}} repository that have labels related to {{label}}", + "instantiation_dict": { + "label": "flaky-test", + "repo": "keycloak/keycloak" + }, + "intent": "Display the list of issues in the keycloak/keycloak repository that have labels related to flaky-test", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/keycloak/keycloak/-/issues/?label_name%5B%5D=flaky-test", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 349 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 105, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Display the list of issues in the {{repo}} repository that have labels related to {{label}}", + "instantiation_dict": { + "label": "OpenAPI Generator CLI", + "repo": "OpenAPITools/openapi-generator" + }, + "intent": "Display the list of issues in the OpenAPITools/openapi-generator repository that have labels related to OpenAPI Generator CLI", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/OpenAPITools/openapi-generator/-/issues/?label_name%5B%5D=OpenAPI%20Generator%20CLI", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 349 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 106, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Display the list of issues in the {{repo}} repository that have labels related to {{label}}", + "instantiation_dict": { + "label": "BUG", + "repo": "umano/AndroidSlidingUpPanel" + }, + "intent": "Display the list of issues in the umano/AndroidSlidingUpPanel repository that have labels related to BUG", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/umano/AndroidSlidingUpPanel/-/issues/?label_name%5B%5D=BUG", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 349 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 107, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Presents the monthly count of successful orders {{period}} in MM:COUNT format", + "instantiation_dict": { + "period": "from May to December 2022" + }, + "intent": "Presents the monthly count of successful orders from May to December 2022 in MM:COUNT format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "May: 8 orders", + "June: 13 orders", + "July: 9 orders", + "August: 8 orders", + "Sepetember: 10 orders", + "October: 4 orders", + "November: 5 orders", + "December: 10 orders" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "May: 8 orders June: 13 orders July: 9 orders August: 8 orders Sepetember: 10 orders Octorbor: 4 orders November: 5 orders December: 10 orders " + }, + "intent_template_id": 270 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 108, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Presents the monthly count of successful orders {{period}} in MM:COUNT format", + "instantiation_dict": { + "period": "01/2023-05/2023" + }, + "intent": "Presents the monthly count of successful orders 01/2023-05/2023 in MM:COUNT format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "January: 12 orders", + "Feburary: 7 orders", + "March: 5 orders", + "April: 9 orders", + "May: 5 orders" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "January: 12 orders Febulary: 7 orders March: 5 orders Apirl: 9 orders May: 5 orders" + }, + "intent_template_id": 270 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 109, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Presents the monthly count of successful orders {{period}} in MM:COUNT format", + "instantiation_dict": { + "period": "from Jan to December 2022" + }, + "intent": "Presents the monthly count of successful orders from Jan to December 2022 in MM:COUNT format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "January: 11 orders", + "Feburary: 16 orders", + "March: 14 orders", + "April: 7 orders", + "May: 8 orders", + "June: 13 orders", + "July: 9 orders", + "August: 8 orders", + "Sepetember: 10 orders", + "Octorbor: 4 orders", + "November: 5 orders", + "December: 10 orders" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "January: 11 orders Feburary: 16 orders March: 14 orders April: 7 orders May: 8 orders June: 13 orders July: 9 orders August: 8 orders Sepetember: 10 orders Octorbor: 4 orders November: 5 orders December: 10 orders " + }, + "intent_template_id": 270 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 110, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Presents the monthly count of successful orders {{period}} in MM:COUNT format", + "instantiation_dict": { + "period": "from Jan to Nov 2022" + }, + "intent": "Presents the monthly count of successful orders from Jan to Nov 2022 in MM:COUNT format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "January: 11 orders", + "Feburary: 16 orders", + "March: 14 orders", + "April: 7 orders", + "May: 8 orders", + "June: 13 orders", + "July: 9 orders", + "August: 8 orders", + "Sepetember: 10 orders", + "Octorbor: 4 orders", + "November: 5 orders" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "January: 11 orders Feburary: 16 orders March: 14 orders April: 7 orders May: 8 orders June: 13 orders July: 9 orders August: 8 orders Sepetember: 10 orders Octorbor: 4 orders November: 5 orders " + }, + "intent_template_id": 270 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 111, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Presents the monthly count of successful orders {{period}} in MM:COUNT format", + "instantiation_dict": { + "period": "from Feb to Nov 2022" + }, + "intent": "Presents the monthly count of successful orders from Feb to Nov 2022 in MM:COUNT format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Feburary: 16 orders", + "March: 14 orders", + "April: 7 orders", + "May: 8 orders", + "June: 13 orders", + "July: 9 orders", + "August: 8 orders", + "Sepetember: 10 orders", + "Octorbor: 4 orders", + "November: 5 orders" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Feburary: 16 orders March: 14 orders April: 7 orders May: 8 orders June: 13 orders July: 9 orders August: 8 orders Sepetember: 10 orders Octorbor: 4 orders November: 5 orders " + }, + "intent_template_id": 270 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 112, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the customers who have expressed dissatisfaction with {{product}}?", + "instantiation_dict": { + "product": "Circe fleece" + }, + "intent": "Show me the customers who have expressed dissatisfaction with Circe fleece?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Hannah Lim" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Hannah Lim" + }, + "intent_template_id": 245 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 113, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the customers who have expressed dissatisfaction with {{product}}?", + "instantiation_dict": { + "product": "Olivia zip jacket" + }, + "intent": "Show me the customers who have expressed dissatisfaction with Olivia zip jacket?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Emma Lopez", + "Seam Miller" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Emma Lopez, Seam Miller" + }, + "intent_template_id": 245 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 114, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the customers who have expressed dissatisfaction with {{product}}?", + "instantiation_dict": { + "product": "Antonia racer tank" + }, + "intent": "Show me the customers who have expressed dissatisfaction with Antonia racer tank?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Shaunte", + "Merrie" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Shaunte, Merrie" + }, + "intent_template_id": 245 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 115, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the name of the customers who have expressed dissatisfaction with {{product}}", + "instantiation_dict": { + "product": "Chloe tank" + }, + "intent": "Show me the name of the customers who have expressed dissatisfaction with Chloe tank", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no negative review for Chloe tank", + "reference_answer_raw_annotation": "" + }, + "intent_template_id": 245 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 116, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the name of the customers who have expressed dissatisfaction with {{product}}?", + "instantiation_dict": { + "product": "tanks products" + }, + "intent": "Show me the name of the customers who have expressed dissatisfaction with tanks products?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Alexander", + "Carma", + "Dominic", + "Merrie", + "Monroe", + "Scotty", + "Shaunte", + "Teofila", + "Valorie" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Alexander, Carma, Dominic, Merrie, Monroe, Scotty, Shaunte, Teofila, Valorie" + }, + "intent_template_id": 245 + }, + { + "sites": [ + "shopping" + ], + "task_id": 117, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the date when I made my first purchase on this site?", + "instantiation_dict": {}, + "intent": "What is the date when I made my first purchase on this site?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "3/2/22" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "3/2/22" + }, + "intent_template_id": 161 + }, + { + "sites": [ + "shopping" + ], + "task_id": 118, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I have jaw bruxism problem, show me something that could alleviate the problem.", + "instantiation_dict": {}, + "intent": "I have jaw bruxism problem, show me something that could alleviate the problem.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "", + "required_contents": { + "must_include": [ + "jaw bruxism", + "mouth guard" + ] + } + } + ] + }, + "intent_template_id": 151 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 119, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the reasons why customers like {{product}}", + "instantiation_dict": { + "product": "Antonia Racer Tank" + }, + "intent": "Tell me the reasons why customers like Antonia Racer Tank", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Its color and style is good" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Its color and style is good" + }, + "intent_template_id": 250 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 120, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the reasons why customers like {{product}}", + "instantiation_dict": { + "product": "Ana Running Short" + }, + "intent": "Tell me the reasons why customers like Ana Running Short", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "It is comfortable" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "It is comfortable" + }, + "intent_template_id": 250 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 121, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the reasons why customers like {{product}}", + "instantiation_dict": { + "product": "Circe hooded fleece" + }, + "intent": "Tell me the reasons why customers like Circe hooded fleece", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Warm and comfortable. True to size." + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Warm and comfortable. True to size." + }, + "intent_template_id": 250 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 122, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the reasons why customers like {{product}}", + "instantiation_dict": { + "product": "Olivia zip jacket" + }, + "intent": "Tell me the reasons why customers like Olivia zip jacket", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Lightweight, comfortable and stylish. Good design and details." + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Lightweight, comfortable, and stylish. Good design and details." + }, + "intent_template_id": 250 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 123, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the reasons why customers like {{product}}", + "instantiation_dict": { + "product": "Circe's products" + }, + "intent": "Tell me the reasons why customers like Circe's products", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Warm and comfortable. True to size." + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Warm and comfortable. True to size." + }, + "intent_template_id": 250 + }, + { + "sites": [ + "shopping" + ], + "task_id": 124, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range of {{product}} in the One Stop Market?", + "instantiation_dict": { + "product": "wireless earphone" + }, + "intent": "What is the price range of wireless earphone in the One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0.14", + "745.00" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$0.14 - $745.00" + }, + "intent_template_id": 159 + }, + { + "sites": [ + "shopping" + ], + "task_id": 125, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range of {{product}} in the One Stop Market?", + "instantiation_dict": { + "product": "teeth grinding mouth guard" + }, + "intent": "What is the price range of teeth grinding mouth guard in the One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1.46", + "85" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$1.46 - $85" + }, + "intent_template_id": 159 + }, + { + "sites": [ + "shopping" + ], + "task_id": 126, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range of {{product}} in the One Stop Market?", + "instantiation_dict": { + "product": "Canon photo printer" + }, + "intent": "What is the price range of Canon photo printer in the One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "2.56", + "649.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$2.56 - $649.99" + }, + "intent_template_id": 159 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 127, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What brands appear most frequently among the top search terms?", + "instantiation_dict": {}, + "intent": "What brands appear most frequently among the top search terms?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Hollister", + "Joust", + "Antonia" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Hollister, Joust, Antonia" + }, + "intent_template_id": 1001 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 128, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What's the total number of items sold in the most recent {{k}} orders?", + "instantiation_dict": { + "k": "2" + }, + "intent": "What's the total number of items sold in the most recent 2 orders?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "9" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "9" + }, + "intent_template_id": 1002 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 129, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What's the total number of items sold in the most recent {{k}} orders?", + "instantiation_dict": { + "k": "4" + }, + "intent": "What's the total number of items sold in the most recent 4 orders?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "16" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "16" + }, + "intent_template_id": 1002 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 130, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What's the total number of items sold in the most recent {{k}} orders?", + "instantiation_dict": { + "k": "5" + }, + "intent": "What's the total number of items sold in the most recent 5 orders?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "18" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "18" + }, + "intent_template_id": 1002 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 131, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What's the total number of items sold in the most recent {{k}} orders?", + "instantiation_dict": { + "k": "7" + }, + "intent": "What's the total number of items sold in the most recent 7 orders?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "25" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "25" + }, + "intent_template_id": 1002 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 132, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "How many commits did {{user}} make to {{repo}} on {{date}}?", + "instantiation_dict": { + "user": "kilian", + "repo": "a11yproject", + "date": "3/5/2023" + }, + "intent": "How many commits did kilian make to a11yproject on 3/5/2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1" + }, + "intent_template_id": 322 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 133, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "How many commits did {{user}} make to {{repo}} on {{date}}?", + "instantiation_dict": { + "user": "Eric", + "repo": "a11yproject", + "date": "3/2" + }, + "intent": "How many commits did Eric make to a11yproject on 3/2?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "2" + }, + "intent_template_id": 322 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 134, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "How many commits did {{user}} make to {{repo}} on {{date}}?", + "instantiation_dict": { + "user": "kilian", + "repo": "a11yproject", + "date": "3/1/2023" + }, + "intent": "How many commits did kilian make to a11yproject on 3/1/2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 322 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 135, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "How many commits did {{user}} make to {{repo}} on {{date}}?", + "instantiation_dict": { + "user": "Eric and Kilian", + "repo": "a11yproject", + "date": "1/3/2023" + }, + "intent": "How many commits did Eric and Kilian make to a11yproject on 1/3/2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1" + }, + "intent_template_id": 322 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 136, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "How many commits did {{user}} make to {{repo}} on {{date}}?", + "instantiation_dict": { + "user": "Steven Woodson", + "repo": "a11y-webring.club", + "date": "2/6/2023" + }, + "intent": "How many commits did Steven Woodson make to a11y-webring.club on 2/6/2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "5" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "5" + }, + "intent_template_id": 322 + }, + { + "sites": [ + "map" + ], + "task_id": 137, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the estimated driving time between {{city1}} and {{city2}}?", + "instantiation_dict": { + "city1": "the city where the Liberty Bell is located", + "city2": "the home city of Pirates" + }, + "intent": "What is the estimated driving time between the city where the Liberty Bell is located and the home city of Pirates?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "5h 47min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "5h 47min" + }, + "intent_template_id": 51 + }, + { + "sites": [ + "map" + ], + "task_id": 138, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the estimated driving time between {{city1}} and {{city2}}?", + "instantiation_dict": { + "city1": "the big apple", + "city2": "the city with the most authentic Philly cheesesteaks" + }, + "intent": "What is the estimated driving time between the big apple and the city with the most authentic Philly cheesesteaks?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "1h 58min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1h 58min" + }, + "intent_template_id": 51 + }, + { + "sites": [ + "map" + ], + "task_id": 139, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the estimated driving time between {{city1}} and {{city2}}?", + "instantiation_dict": { + "city1": "the hometown of Joe Biden", + "city2": "Bridgeport" + }, + "intent": "What is the estimated driving time between the hometown of Joe Biden and Bridgeport?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "3h 20min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "3h 20min" + }, + "intent_template_id": 51 + }, + { + "sites": [ + "map" + ], + "task_id": 140, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the estimated driving time between {{city1}} and {{city2}}?", + "instantiation_dict": { + "city1": "the city of Niagara Falls", + "city2": "the city of Yale University" + }, + "intent": "What is the estimated driving time between the city of Niagara Falls and the city of Yale University?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "8h 33min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "8h 33min" + }, + "intent_template_id": 51 + }, + { + "sites": [ + "shopping" + ], + "task_id": 141, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spent on {{category}} shopping during {{time}}", + "instantiation_dict": { + "category": "food-related", + "time": "March 2023" + }, + "intent": "How much I spent on food-related shopping during March 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "47.41" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$47.41" + }, + "intent_template_id": 162 + }, + { + "sites": [ + "shopping" + ], + "task_id": 142, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spent on {{category}} shopping during {{time}}", + "instantiation_dict": { + "category": "hair care and hair style", + "time": "Jan 2023" + }, + "intent": "How much I spent on hair care and hair style shopping during Jan 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "95.23" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$95.23" + }, + "intent_template_id": 162 + }, + { + "sites": [ + "shopping" + ], + "task_id": 143, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spent on {{category}} shopping during {{time}}", + "instantiation_dict": { + "category": "home decoration", + "time": "1/29/2023" + }, + "intent": "How much I spent on home decoration shopping during 1/29/2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "265.69" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$265.69" + }, + "intent_template_id": 162 + }, + { + "sites": [ + "shopping" + ], + "task_id": 144, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spent on {{category}} shopping during {{time}}", + "instantiation_dict": { + "category": "food", + "time": "from mid Jan to the end Jan 2023" + }, + "intent": "How much I spent on food shopping during from mid Jan to the end Jan 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 162 + }, + { + "sites": [ + "shopping" + ], + "task_id": 145, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spent on {{category}} shopping during {{time}}", + "instantiation_dict": { + "category": "cooking and food", + "time": "March 2022" + }, + "intent": "How much I spent on cooking and food shopping during March 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "52.35" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$52.35" + }, + "intent_template_id": 162 + }, + { + "sites": [ + "shopping" + ], + "task_id": 146, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the {{option}} configuration of the {{product}} I bought {{time}}", + "instantiation_dict": { + "option": "size", + "product": "picture frame", + "time": "Sep 2022" + }, + "intent": "What is the size configuration of the picture frame I bought Sep 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "16x24" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "16x24" + }, + "intent_template_id": 155 + }, + { + "sites": [ + "shopping" + ], + "task_id": 147, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the {{option}} configuration of the {{product}} I bought {{time}}", + "instantiation_dict": { + "option": "size", + "product": "picture frame", + "time": "2022" + }, + "intent": "What is the size configuration of the picture frame I bought 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "16x24" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "16x24" + }, + "intent_template_id": 155 + }, + { + "sites": [ + "shopping" + ], + "task_id": 148, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the {{option}} configuration of the {{product}} I bought {{time}}", + "instantiation_dict": { + "option": "color", + "product": "picture frame", + "time": "Sep 2022" + }, + "intent": "What is the color configuration of the picture frame I bought Sep 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Mist" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Mist" + }, + "intent_template_id": 155 + }, + { + "sites": [ + "shopping" + ], + "task_id": 149, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the {{option}} configuration of the {{product}} I bought {{time}}", + "instantiation_dict": { + "option": "color", + "product": "artifical plants", + "time": "Feb 2023" + }, + "intent": "What is the color configuration of the artifical plants I bought Feb 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Green-vines" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Green-vines" + }, + "intent_template_id": 155 + }, + { + "sites": [ + "shopping" + ], + "task_id": 150, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the {{option}} configuration of the {{product}} I bought {{time}}", + "instantiation_dict": { + "option": "price", + "product": "fake tree", + "time": "Jan 2023" + }, + "intent": "What is the price configuration of the fake tree I bought Jan 2023", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "260.69" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "260.69" + }, + "intent_template_id": 155 + }, + { + "sites": [ + "map" + ], + "task_id": 151, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the minimum travel time by car from {{location1}} to {{location2}}?", + "instantiation_dict": { + "location1": "CMU", + "location2": "University of Pittsburgh" + }, + "intent": "What is the minimum travel time by car from CMU to University of Pittsburgh?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "4min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "4min" + }, + "intent_template_id": 36 + }, + { + "sites": [ + "map" + ], + "task_id": 152, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the minimum travel time by car from {{location1}} to {{location2}}?", + "instantiation_dict": { + "location1": "Schenley park", + "location2": "Upitt" + }, + "intent": "What is the minimum travel time by car from Schenley park to Upitt?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "4min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "4min" + }, + "intent_template_id": 36 + }, + { + "sites": [ + "map" + ], + "task_id": 153, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the minimum travel time by car from {{location1}} to {{location2}}?", + "instantiation_dict": { + "location1": "REI", + "location2": "CMU" + }, + "intent": "What is the minimum travel time by car from REI to CMU?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "7min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "7min" + }, + "intent_template_id": 36 + }, + { + "sites": [ + "map" + ], + "task_id": 154, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the minimum travel time by car from {{location1}} to {{location2}}?", + "instantiation_dict": { + "location1": "CMU gates building", + "location2": "Schenley park" + }, + "intent": "What is the minimum travel time by car from CMU gates building to Schenley park?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "4min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "4min" + }, + "intent_template_id": 36 + }, + { + "sites": [ + "map" + ], + "task_id": 155, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the minimum travel time by car from {{location1}} to {{location2}}?", + "instantiation_dict": { + "location1": "Animal Rescue League of Pittsburgh", + "location2": "Schenley park" + }, + "intent": "What is the minimum travel time by car from Animal Rescue League of Pittsburgh to Schenley park?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "9min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "9min" + }, + "intent_template_id": 36 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 156, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Checkout merge requests assigned to me", + "instantiation_dict": {}, + "intent": "Checkout merge requests assigned to me", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/dashboard/merge_requests?assignee_username=byteblaze", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 290 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 157, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show all customers", + "instantiation_dict": {}, + "intent": "Show all customers", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/customer/index/", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 255 + }, + { + "sites": [ + "shopping" + ], + "task_id": 158, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all {{num}} cards", + "instantiation_dict": { + "num": 11 + }, + "intent": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all 11 cards", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/heiying-game-card-case-for-nintendo-switch-switch-oled-game-card-or-micro-sd-memory-cards-portable-switch-game-memory-card-storage-with-24-game-card-slots-and-24-micro-sd-card-slots-black.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 171 + }, + { + "sites": [ + "shopping" + ], + "task_id": 159, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all {{num}} cards", + "instantiation_dict": { + "num": 31 + }, + "intent": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all 31 cards", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/game-card-holder-storage-case-for-nintendo-switch-games-or-ps-vita-game-case-or-sd-memory-cards-black.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 171 + }, + { + "sites": [ + "shopping" + ], + "task_id": 160, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all {{num}} cards", + "instantiation_dict": { + "num": 6 + }, + "intent": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all 6 cards", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/heiying-game-card-case-for-nintendo-switch-switch-oled-game-card-or-micro-sd-memory-cards-portable-switch-game-memory-card-storage-with-24-game-card-slots-and-24-micro-sd-card-slots-black.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 171 + }, + { + "sites": [ + "shopping" + ], + "task_id": 161, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all {{num}} cards", + "instantiation_dict": { + "num": 23 + }, + "intent": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all 23 cards", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/heiying-game-card-case-for-nintendo-switch-switch-oled-game-card-or-micro-sd-memory-cards-portable-switch-game-memory-card-storage-with-24-game-card-slots-and-24-micro-sd-card-slots-black.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 171 + }, + { + "sites": [ + "shopping" + ], + "task_id": 162, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all {{num}} cards", + "instantiation_dict": { + "num": 40 + }, + "intent": "I have a lot of Nintendo Switch game cards now, help me find the best storage option to fit all 40 cards", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/game-card-holder-storage-case-for-nintendo-switch-games-or-ps-vita-game-case-or-sd-memory-cards-black.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 171 + }, + { + "sites": [ + "shopping" + ], + "task_id": 163, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/ostent-16gb-memory-card-stick-storage-for-sony-ps-vita-psv1000-2000-pch-z081-z161-z321-z641.html", + "geolocation": null, + "intent_template": "What are the main criticisms of this product? Please extract the relevant sentences.", + "instantiation_dict": {}, + "intent": "What are the main criticisms of this product? Please extract the relevant sentences.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "I ordered the 16gb but I only got 14 gigs even though I formatted the card", + "The memory card is kind of slow on games and downloads", + "No original packaging It's used and the previous owners data has not been erased", + "The product is a legit sony hardware that have been owned by someone else before", + "The media could not be loaded", + "I could not format the card so I wasn\u2019t able to use it for my VITA" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "I ordered the 16gb but I only got 14 gigs even though I formatted the card. The memory card is kind of slow on games and downloads. No original packaging It's used and the previous owners data has not been erased. The product is a legit sony hardware that have been owned by someone else before The media could not be loaded. I could not format the card so I wasn\u2019t able to use it for my VITA" + }, + "intent_template_id": 136 + }, + { + "sites": [ + "shopping" + ], + "task_id": 164, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/mineralogie-all-natural-lip-gloss-ruby-rose.html", + "geolocation": null, + "intent_template": "What are the main criticisms of this product? Please extract the relevant sentences.", + "instantiation_dict": {}, + "intent": "What are the main criticisms of this product? Please extract the relevant sentences.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Dry", + "Uneven color" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "DryUneven color" + }, + "intent_template_id": 136 + }, + { + "sites": [ + "shopping" + ], + "task_id": 165, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/sandgrens-swedish-handmade-wooden-clog-sandal-copenhagen.html", + "geolocation": null, + "intent_template": "What are the main criticisms of this product? Please extract the relevant sentences.", + "instantiation_dict": {}, + "intent": "What are the main criticisms of this product? Please extract the relevant sentences.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "The 39 was too small. I am afraid the 40 will be too big", + "I was very sad when the shoe rubbed up against my baby toe", + "I had to return them because I knew in time it would tear up my feet", + "The problem is that the strap is made of some really stiff leather and is painful to my heel", + "The front is also uncomfortably tight", + "The Dansko's were similar (not as bad) and loosened up over time" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "The 39 was too small. I am afraid the 40 will be too big. I was very sad when the shoe rubbed up against my baby toe. I had to return them because I knew in time it would tear up my feet. The problem is that the strap is made of some really stiff leather and is painful to my heel. The front is also uncomfortably tight. The Dansko's were similar (not as bad) and loosened up over time." + }, + "intent_template_id": 136 + }, + { + "sites": [ + "shopping" + ], + "task_id": 166, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/sensodyne-repair-protect-whitening-toothpaste-with-fluoride-3-4-oz-pack-of-3.html", + "geolocation": null, + "intent_template": "What are the main criticisms of this product? Please extract the relevant sentences.", + "instantiation_dict": {}, + "intent": "What are the main criticisms of this product? Please extract the relevant sentences.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "there is no existing criticism", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 136 + }, + { + "sites": [ + "shopping" + ], + "task_id": 167, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/photosmart-plus-b209-clr-inkjetfb-p-s-c-usb-wrls-1.html", + "geolocation": null, + "intent_template": "What are the main criticisms of this product? Please extract the relevant sentences.", + "instantiation_dict": {}, + "intent": "What are the main criticisms of this product? Please extract the relevant sentences.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "The wireless connection works on a whim (about 40% of the time I've owned it)", + "It seems to constantly run out of ink", + "Cartridge prices are less than some printers I've had", + "This printer seems to have more reasons NOT to work (none that are findable or correctable) Ex: error boxes saying that it's out of paper when it automatically switches to photo printing for some reason", + "Scanner is as slow as my first scanner I ever owned in the mid-90's", + "For the $176 I paid, there isn't even a fax component on it. I guess the \"PLUS\" part of it's name is in reference to the migraines it causes when you can't figure out the new reason why it's not working for the 10th time in the past 2 months." + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "The wireless connection works on a whim (about 40% of the time I've owned it). It seems to constantly run out of ink. Cartridge prices are less than some printers I've had, but now I understand why. This printer seems to have more reasons NOT to work (none that are findable or correctable) Ex: error boxes saying that it's out of paper when it automatically switches to photo printing for some reason. Scanner is as slow as my first scanner I ever owned in the mid-90's. For the $176 I paid, there isn't even a fax component on it. I guess the \"PLUS\" part of it's name is in reference to the migraines it causes when you can't figure out the new reason why it's not working for the 10th time in the past 2 months." + }, + "intent_template_id": 136 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 168, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me the full names of the repositories where I made contributions and they got {{description}} stars?", + "instantiation_dict": { + "description": "more than 100" + }, + "intent": "Tell me the full names of the repositories where I made contributions and they got more than 100 stars?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "No repo found", + "reference_answer_raw_annotation": "No repo found" + }, + "intent_template_id": 289 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 169, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me the full names of the repositories where I made contributions and they got {{description}} stars?", + "instantiation_dict": { + "description": "the most" + }, + "intent": "Tell me the full names of the repositories where I made contributions and they got the most stars?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "a11yproject.com", + "design" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "a11yproject.com, Primer/design" + }, + "intent_template_id": 289 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 170, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me the full names of the repositories where I made contributions and they got {{description}} stars?", + "instantiation_dict": { + "description": "the least" + }, + "intent": "Tell me the full names of the repositories where I made contributions and they got the least stars?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "cloud-to-butt", + "dotfiles", + "timeit", + "solarized-prism-theme", + "gimmiethat.space", + "remove-board-movement-events-from-the-github-issue-timeline" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "cloud-to-butt, dotfiles, timeit, solarized-prism-theme, gimmiethat.space, remove-board-movement-events-from-the-github-issue-timeline" + }, + "intent_template_id": 289 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 171, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me the full names of the repositories where I made contributions and they got {{description}} stars?", + "instantiation_dict": { + "description": "less than 5" + }, + "intent": "Tell me the full names of the repositories where I made contributions and they got less than 5 stars?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "a11y-syntax-highlighting", + "a11y-webring.club", + "accessible-html-content-patterns", + "ericwbailey.website", + "cloud-to-butt", + "dotfiles", + "timeit", + "solarized-prism-theme", + "gimmiethat.space", + "remove-board-movement-events-from-the-github-issue-timeline" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "a11y-syntax-highlighting, a11y-webring.club, accessible-html-content-patterns, ericwbailey.website, cloud-to-butt, dotfiles, timeit, solarized-prism-theme, gimmiethat.space, remove-board-movement-events-from-the-github-issue-timeline" + }, + "intent_template_id": 289 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 172, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me the full names of the repositories where I made contributions and they got {{description}} stars?", + "instantiation_dict": { + "description": "no" + }, + "intent": "Tell me the full names of the repositories where I made contributions and they got no stars?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "cloud-to-butt", + "dotfiles", + "timeit", + "solarized-prism-theme", + "gimmiethat.space", + "remove-board-movement-events-from-the-github-issue-timeline" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "cloud-to-butt, dotfiles, timeit, solarized-prism-theme, gimmiethat.space, remove-board-movement-events-from-the-github-issue-timeline" + }, + "intent_template_id": 289 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 173, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest updated issue that has keyword \"{{keyword}}\" in its title to check if it is closed", + "instantiation_dict": { + "keyword": "better" + }, + "intent": "Open my latest updated issue that has keyword \"better\" in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["No, it is open"] + }, + "reference_url": "__GITLAB__/byteblaze/empathy-prompts/-/issues/8", + "program_html": [], + "reference_answer_raw_annotation": "Not closed", + "string_note": "", + "url_note": "GOLD in PRED" + }, + "intent_template_id": 310 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 174, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest updated issue that has keyword \"{{keyword}}\" in its title to check if it is closed", + "instantiation_dict": { + "keyword": "feature" + }, + "intent": "Open my latest updated issue that has keyword \"feature\" in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["No, it is open"] + }, + "reference_url": "__GITLAB__/byteblaze/a11y-webring.club/-/issues/71", + "program_html": [], + "reference_answer_raw_annotation": "Not closed", + "string_note": "" + }, + "intent_template_id": 310 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 175, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest updated issue that has keyword \"{{keyword}}\" in its title to check if it is closed", + "instantiation_dict": { + "keyword": "dependency" + }, + "intent": "Open my latest updated issue that has keyword \"dependency\" in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["No, it is open"] + }, + "reference_url": "__GITLAB__/byteblaze/empathy-prompts/-/issues/18", + "program_html": [], + "reference_answer_raw_annotation": "Not closed", + "string_note": "" + }, + "intent_template_id": 310 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 176, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest updated issue that has keyword \"{{keyword}}\" in its title to check if it is closed", + "instantiation_dict": { + "keyword": "theme editor" + }, + "intent": "Open my latest updated issue that has keyword \"theme editor\" in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["No, it is open"] + }, + "reference_url": "__GITLAB__/byteblaze/a11y-syntax-highlighting/-/issues/1", + "program_html": [], + "reference_answer_raw_annotation": "Not closed", + "string_note": "" + }, + "intent_template_id": 310 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 177, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest updated issue that has keyword \"{{keyword}}\" in its title to check if it is closed", + "instantiation_dict": { + "keyword": "homepage content" + }, + "intent": "Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["Yes, it is closed"] + }, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues/719", + "program_html": [], + "reference_answer_raw_annotation": "closed", + "string_note": "" + }, + "intent_template_id": 310 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 178, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest created issue that has {{keyword}} in its title to check if it is closed", + "instantiation_dict": { + "keyword": "better" + }, + "intent": "Open my latest created issue that has better in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["Yes, it is closed"] + }, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues/566", + "program_html": [], + "reference_answer_raw_annotation": "Closed", + "string_note": "" + }, + "intent_template_id": 500 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 179, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest created issue that has {{keyword}} in its title to check if it is closed", + "instantiation_dict": { + "keyword": "feature" + }, + "intent": "Open my latest created issue that has feature in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["Yes, it is closed"] + }, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues/1517", + "program_html": [], + "reference_answer_raw_annotation": "Closed", + "string_note": "" + }, + "intent_template_id": 500 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 180, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest created issue that has {{keyword}} in its title to check if it is closed", + "instantiation_dict": { + "keyword": "dependency" + }, + "intent": "Open my latest created issue that has dependency in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["No, it is open"] + }, + "reference_url": "__GITLAB__/byteblaze/empathy-prompts/-/issues/18", + "program_html": [], + "reference_answer_raw_annotation": "Not closed", + "string_note": "" + }, + "intent_template_id": 500 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 181, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest created issue that has {{keyword}} in its title to check if it is closed", + "instantiation_dict": { + "keyword": "theme editor" + }, + "intent": "Open my latest created issue that has theme editor in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["No, it is open"] + }, + "reference_url": "__GITLAB__/byteblaze/a11y-syntax-highlighting/-/issues/1", + "program_html": [], + "reference_answer_raw_annotation": "Not closed", + "string_note": "" + }, + "intent_template_id": 500 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 182, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open my latest created issue that has {{keyword}} in its title to check if it is closed", + "instantiation_dict": { + "keyword": "homepage content" + }, + "intent": "Open my latest created issue that has homepage content in its title to check if it is closed", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match", + "url_match" + ], + "reference_answers": { + "fuzzy_match": ["Yes, it is closed"] + }, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues/719", + "program_html": [], + "reference_answer_raw_annotation": "closed", + "string_note": "" + }, + "intent_template_id": 500 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 183, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Give me the {{Attribute}} of the products that have {{N}} units left", + "instantiation_dict": { + "Attribute": "SKU", + "N": "10" + }, + "intent": "Give me the SKU of the products that have 10 units left", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no product that has 10 quantities left.", + "reference_answer_raw_annotation": "There is no product that has 10 quantities left." + }, + "intent_template_id": 368 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 184, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Give me the {{Attribute}} of the products that have {{N}} units left", + "instantiation_dict": { + "Attribute": "name", + "N": "0" + }, + "intent": "Give me the name of the products that have 0 units left", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Sinbad Fitness Tank" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Sinbad Fitness Tank" + }, + "intent_template_id": 368 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 185, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Give me the {{Attribute}} of the products that have {{N}} units left", + "instantiation_dict": { + "Attribute": "brand", + "N": "3" + }, + "intent": "Give me the brand of the products that have 3 units left", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Eos", + "Minerva" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Eos, Minerva" + }, + "intent_template_id": 368 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 186, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Give me the {{Attribute}} of the products that have {{N}} units left", + "instantiation_dict": { + "Attribute": "product names and the sizes", + "N": "2-3" + }, + "intent": "Give me the product names and the sizes of the products that have 2-3 units left", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Eos V-Neck Hoodie: S", + "Minera Luma Tech V-Tee: XS" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Eos V-Neck Hoodie: S Minera Luma Tech V-Tee: XS" + }, + "intent_template_id": 368 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 187, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Give me the {{Attribute}} of the products that have {{N}} units left", + "instantiation_dict": { + "Attribute": "SKU", + "N": "1-3" + }, + "intent": "Give me the SKU of the products that have 1-3 units left", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "WH11-S-Blue", + "WS08-XS-Blue" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "WH11-S-Blue, WS08-XS-Blue" + }, + "intent_template_id": 368 + }, + { + "sites": [ + "shopping" + ], + "task_id": 188, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me the total cost of my latest {{status}} order?", + "instantiation_dict": { + "status": "cancelled" + }, + "intent": "Tell me the total cost of my latest cancelled order?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "365.42" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "365.42" + }, + "intent_template_id": 214 + }, + { + "sites": [ + "shopping" + ], + "task_id": 189, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me the total cost of my latest {{status}} order?", + "instantiation_dict": { + "status": "pending" + }, + "intent": "Tell me the total cost of my latest pending order?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "754.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "754.99" + }, + "intent_template_id": 214 + }, + { + "sites": [ + "shopping" + ], + "task_id": 190, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me the total cost of my latest {{status}} order?", + "instantiation_dict": { + "status": "complete" + }, + "intent": "Tell me the total cost of my latest complete order?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "65.32" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "65.32" + }, + "intent_template_id": 214 + }, + { + "sites": [ + "shopping" + ], + "task_id": 191, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me the total cost of my latest {{status}} order?", + "instantiation_dict": { + "status": "processing" + }, + "intent": "Tell me the total cost of my latest processing order?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no order of \"processing\" status", + "reference_answer_raw_annotation": "There is no order of \"processing\" status" + }, + "intent_template_id": 214 + }, + { + "sites": [ + "shopping" + ], + "task_id": 192, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me the total cost of my latest {{status}} order?", + "instantiation_dict": { + "status": "non-cancelled" + }, + "intent": "Tell me the total cost of my latest non-cancelled order?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "754.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "754.99" + }, + "intent_template_id": 214 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 193, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the total payment amount of the last {{N}} {{status}} orders", + "instantiation_dict": { + "status": "completed", + "N": "2" + }, + "intent": "Get the total payment amount of the last 2 completed orders", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "182.4" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "182.4" + }, + "intent_template_id": 367 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 194, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the total payment amount of the last {{N}} {{status}} orders", + "instantiation_dict": { + "status": "completed", + "N": "5" + }, + "intent": "Get the total payment amount of the last 5 completed orders", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "555.2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "555.2" + }, + "intent_template_id": 367 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 195, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the total payment amount of the last {{N}} {{status}} orders", + "instantiation_dict": { + "status": "pending", + "N": "5" + }, + "intent": "Get the total payment amount of the last 5 pending orders", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "885.4" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "885.4" + }, + "intent_template_id": 367 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 196, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Compare the payment difference of the last {{N}} {{status_1}} orders and {{status_2}} orders", + "instantiation_dict": { + "status_1": "cancelled", + "status_2": "completed", + "N": "4" + }, + "intent": "Compare the payment difference of the last 4 cancelled orders and completed orders", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "194.25" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "194.25" + }, + "intent_template_id": 367 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 197, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the total payment amount of the last {{N}} {{status}} orders", + "instantiation_dict": { + "status": "non-cancelled", + "N": "5" + }, + "intent": "Get the total payment amount of the last 5 non-cancelled orders", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "778.2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "annotation_note": "219.4+210+166.4+93.4+89", + "reference_answer_raw_annotation": "778.2" + }, + "intent_template_id": 367 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 198, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "customer name", + "status": "most recent cancelled" + }, + "intent": "Get the customer name of the most recent cancelled order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Lily Potter" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Lily Potter" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 199, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "order ID", + "status": "newest pending" + }, + "intent": "Get the order ID of the newest pending order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "299" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "299" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 200, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "billing name", + "status": "oldest complete" + }, + "intent": "Get the billing name of the oldest complete order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "John Lee" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "John Lee" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 201, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "customer name", + "status": "earliest fraud suspect" + }, + "intent": "Get the customer name of the earliest fraud suspect order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no order of \"fraud suspect\" status", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 202, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "date", + "status": "most recent canlled" + }, + "intent": "Get the date of the most recent canlled order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "May 23 2023" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "May 23, 2023" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 203, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "purchase date and order id", + "status": "most recent pending" + }, + "intent": "Get the purchase date and order id of the most recent pending order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "order id: 000000299", + "purchase date: May 31, 2023" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "000000299, May 31, 2023, 2:55:09 AM" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 204, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Get the {{attribute}} of the {{status}} order", + "instantiation_dict": { + "attribute": "product name and discounted price (low to high)", + "status": "most recent completed" + }, + "intent": "Get the product name and discounted price (low to high) of the most recent completed order", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Rapha Sports Short: $35", + "Thorpe Track Pant: $54.4", + "Mach Street Sweatshirt: $62" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Rapha Sports Short: $35 Thorpe Track Pant: $54.4 Mach Street Sweatshirt: $62" + }, + "intent_template_id": 366 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 205, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make on {{date}}?", + "instantiation_dict": { + "user": "kilian", + "date": "3/5/2023" + }, + "intent": "How many commits did kilian make on 3/5/2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1" + }, + "intent_template_id": 320 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 206, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make on {{date}}?", + "instantiation_dict": { + "user": "Eric", + "date": "3/2" + }, + "intent": "How many commits did Eric make on 3/2?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "2" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "2" + }, + "intent_template_id": 320 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 207, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make on {{date}} in total?", + "instantiation_dict": { + "user": "Eric and Kilian", + "date": "1/3/2023" + }, + "intent": "How many commits did Eric and Kilian make on 1/3/2023 in total?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1" + }, + "intent_template_id": 320 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 208, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Find the customer name and email with phone number {{PhoneNum}}", + "instantiation_dict": { + "PhoneNum": "+1 2058812302" + }, + "intent": "Find the customer name and email with phone number +1 2058812302", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "John Smith", + "john.smith.xyz@gmail.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "John Smith, john.smith.xyz@gmail.com" + }, + "intent_template_id": 364 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 209, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Find the customer name and email with phone number {{PhoneNum}}", + "instantiation_dict": { + "PhoneNum": "2137418080" + }, + "intent": "Find the customer name and email with phone number 2137418080", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Jennifer White", + "jennifer.white@yahoo.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Jennifer White, jennifer.white@yahoo.com" + }, + "intent_template_id": 364 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 210, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Find the customer name and email with phone number {{PhoneNum}}", + "instantiation_dict": { + "PhoneNum": "2065555555" + }, + "intent": "Find the customer name and email with phone number 2065555555", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Adam Garcia", + "gamingpro456@gmail.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Adam Garcia, gamingpro456@gmail.com" + }, + "intent_template_id": 364 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 211, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Find the customer name and email with phone number {{PhoneNum}}", + "instantiation_dict": { + "PhoneNum": "8015551212" + }, + "intent": "Find the customer name and email with phone number 8015551212", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Sean Miller", + "sean.miller@gmail.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Sean Miller, sean.miller@gmail.com" + }, + "intent_template_id": 364 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 212, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Find the customer name and email with phone number {{PhoneNum}}", + "instantiation_dict": { + "PhoneNum": "555-229-3326" + }, + "intent": "Find the customer name and email with phone number 555-229-3326", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Veronica Costello", + "roni_cost@example.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Veronica Costello, roni_cost@example.com" + }, + "intent_template_id": 364 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 213, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the key aspects that the customers don't like about {{product}}", + "instantiation_dict": { + "product": "Antonia Racer Tank" + }, + "intent": "What are the key aspects that the customers don't like about Antonia Racer Tank", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Not suitable for high-impact workouts" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Not suitable for high-impact workouts" + }, + "intent_template_id": 249 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 214, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the key aspects that the customers don't like about {{product}}", + "instantiation_dict": { + "product": "Zing Jump Rope" + }, + "intent": "What are the key aspects that the customers don't like about Zing Jump Rope", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "It is hard to find the right size. Won't last long" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "It is hard to find the right size. Won't last long" + }, + "intent_template_id": 249 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 215, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the key aspects that the customers don't like about {{product}}", + "instantiation_dict": { + "product": "Circe ice fleece" + }, + "intent": "What are the key aspects that the customers don't like about Circe ice fleece", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Material quality, fit, insufficient warmth, color" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Material quality, fit, insufficient warmth, color" + }, + "intent_template_id": 249 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 216, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the key aspects that the customers don't like about {{product}}", + "instantiation_dict": { + "product": "Electra Bra Top" + }, + "intent": "What are the key aspects that the customers don't like about Electra Bra Top", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Not true to size" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Not true to size" + }, + "intent_template_id": 249 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 217, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "What are the key aspects that the customers don't like about {{product}}", + "instantiation_dict": { + "product": "Pursuit Tone Band" + }, + "intent": "What are the key aspects that the customers don't like about Pursuit Tone Band", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Insufficient resistance for their workouts." + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Insufficient resistance for their workouts." + }, + "intent_template_id": 249 + }, + { + "sites": [ + "map" + ], + "task_id": 218, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the walking distance from nearby hotels to {{location}} that take at most {{n}} minutes?", + "instantiation_dict": { + "location": "CMU, Pittsburgh", + "n": "5" + }, + "intent": "Show me the walking distance from nearby hotels to CMU, Pittsburgh that take at most 5 minutes?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no hotel near CMU that is within 5 minutes walking distance", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 41 + }, + { + "sites": [ + "map" + ], + "task_id": 219, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the walking distance from nearby hotels to {{location}} that take at most {{n}} minutes?", + "instantiation_dict": { + "location": "Pittsburgh airport", + "n": "3" + }, + "intent": "Show me the walking distance from nearby hotels to Pittsburgh airport that take at most 3 minutes?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no hotel near CMU that is within 5 minutes walking distance", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 41 + }, + { + "sites": [ + "map" + ], + "task_id": 220, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the walking distance from nearby hotels to {{location}} that take at most {{n}} minutes?", + "instantiation_dict": { + "location": "Gardner Steel Conference Center,", + "n": 5 + }, + "intent": "Show me the walking distance from nearby hotels to Gardner Steel Conference Center, that take at most 5 minutes?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Wyndham Pittsburgh University Cente: 375m", + "The Oaklander Hotel: 338m" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Wyndham Pittsburgh University Cente: 375 m\nThe Oaklander Hotel: 338 m" + }, + "intent_template_id": 41 + }, + { + "sites": [ + "map" + ], + "task_id": 221, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I am at CMU Pittsburgh, how long it takes to the nearest {{location}} with different transportation methods?", + "instantiation_dict": { + "location": "USPS postal office" + }, + "intent": "I am at CMU Pittsburgh, how long it takes to the nearest USPS postal office with different transportation methods?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Walk: 1 minute", + "Drive: less than 1 minute", + "Bike: less than 1 minute" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Walk: 1 minute to walk and\nDrive: less than 1 minute\nBike: less than 1 minute" + }, + "intent_template_id": 35 + }, + { + "sites": [ + "map" + ], + "task_id": 222, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I am at CMU Pittsburgh, how long it takes to drive to the nearest {{location}}", + "instantiation_dict": { + "location": "cold stone ice cream" + }, + "intent": "I am at CMU Pittsburgh, how long it takes to drive to the nearest cold stone ice cream", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "3min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "3min" + }, + "intent_template_id": 35 + }, + { + "sites": [ + "map" + ], + "task_id": 223, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I am at CMU Pittsburgh, how long it takes to drive to the nearest {{location}}", + "instantiation_dict": { + "location": "Mcdonald's" + }, + "intent": "I am at CMU Pittsburgh, how long it takes to drive to the nearest Mcdonald's", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "4min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "4min" + }, + "intent_template_id": 35 + }, + { + "sites": [ + "map" + ], + "task_id": 224, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I am at CMU Pittsburgh, how long it takes to drive to the nearest {{location}}", + "instantiation_dict": { + "location": "wendys" + }, + "intent": "I am at CMU Pittsburgh, how long it takes to drive to the nearest wendys", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "3min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "3min" + }, + "intent_template_id": 35 + }, + { + "sites": [ + "shopping" + ], + "task_id": 225, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What do customers say about {{product_type}} from {{manufature}}", + "instantiation_dict": { + "product_type": "brush", + "manufature": "sephora" + }, + "intent": "What do customers say about brush from sephora", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The sephora brushes don't have reviews", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 135 + }, + { + "sites": [ + "shopping" + ], + "task_id": 226, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range for products from {{brand}}?", + "instantiation_dict": { + "brand": "Amazon basic" + }, + "intent": "What is the price range for products from Amazon basic?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "5.49", + "375.19" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$5.49 - $375.19" + }, + "intent_template_id": 370 + }, + { + "sites": [ + "shopping" + ], + "task_id": 227, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range for products from {{brand}}?", + "instantiation_dict": { + "brand": "EYZUTAK" + }, + "intent": "What is the price range for products from EYZUTAK?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "9.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$9.99" + }, + "intent_template_id": 370 + }, + { + "sites": [ + "shopping" + ], + "task_id": 228, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range for products from {{brand}}?", + "instantiation_dict": { + "brand": "sephora" + }, + "intent": "What is the price range for products from sephora?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "18.18", + "94.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$18.18 - $94.99" + }, + "intent_template_id": 370 + }, + { + "sites": [ + "shopping" + ], + "task_id": 229, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range for products from {{brand}}?", + "instantiation_dict": { + "brand": "ugreen" + }, + "intent": "What is the price range for products from ugreen?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "6.99", + "38.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$6.99 - $38.99" + }, + "intent_template_id": 370 + }, + { + "sites": [ + "shopping" + ], + "task_id": 230, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the price range for products from {{brand}}?", + "instantiation_dict": { + "brand": "Perricone MD" + }, + "intent": "What is the price range for products from Perricone MD?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "35", + "149" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$35 - $149" + }, + "intent_template_id": 370 + }, + { + "sites": [ + "shopping" + ], + "task_id": 231, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Get the order number of my most recent {{status}} order ", + "instantiation_dict": { + "status": "cancelled" + }, + "intent": "Get the order number of my most recent cancelled order ", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "170" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "000000170" + }, + "intent_template_id": 213 + }, + { + "sites": [ + "shopping" + ], + "task_id": 232, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Get the order number of my most recent {{status}} order ", + "instantiation_dict": { + "status": "pending" + }, + "intent": "Get the order number of my most recent pending order ", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "189" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "000000189" + }, + "intent_template_id": 213 + }, + { + "sites": [ + "shopping" + ], + "task_id": 233, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Get the order number of my most recent {{status}} order ", + "instantiation_dict": { + "status": "complete" + }, + "intent": "Get the order number of my most recent complete order ", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "180" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "000000180" + }, + "intent_template_id": 213 + }, + { + "sites": [ + "shopping" + ], + "task_id": 234, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Get the order number of my most recent {{status}} order ", + "instantiation_dict": { + "status": "on hold" + }, + "intent": "Get the order number of my most recent on hold order ", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "there is no on hold order", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 213 + }, + { + "sites": [ + "shopping" + ], + "task_id": 235, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Get the order number of my most recent {{status}} order ", + "instantiation_dict": { + "status": "under delivery" + }, + "intent": "Get the order number of my most recent under delivery order ", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no under delivery order", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 213 + }, + { + "sites": [ + "map" + ], + "task_id": 236, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Where is the nearest {{location}} from {{location2}} {{condition}}", + "instantiation_dict": { + "location": "pharmacy", + "location2": "Carnegie Mellon", + "condition": "I can walk within 20mins" + }, + "intent": "Where is the nearest pharmacy from Carnegie Mellon I can walk within 20mins", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Schiller's Pharmacy", + "811", + "South Aiken Avenue", + "Shadyside", + "Pittsburgh" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Schiller's Pharmacy, 811, South Aiken Avenue, Shadyside, Pittsburgh, Allegheny County, 15232, United States" + }, + "intent_template_id": 39 + }, + { + "sites": [ + "map" + ], + "task_id": 237, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Where is the nearest {{location}} from {{location2}} {{condition}}", + "instantiation_dict": { + "location": "gas station", + "location2": "CMU", + "condition": "" + }, + "intent": "Where is the nearest gas station from CMU ", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Sunoco", + "North Craig Street", + "North Oakland", + "Pittsburgh" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Sunoco, North Craig Street, North Oakland, Pittsburgh, Allegheny County, 15213, United States" + }, + "intent_template_id": 39 + }, + { + "sites": [ + "shopping" + ], + "task_id": 238, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I am doing a market survey for one stop market, show me the most expensive product from {{product_category}} category", + "instantiation_dict": { + "product_category": "PS4 accessories" + }, + "intent": "I am doing a market survey for one stop market, show me the most expensive product from PS4 accessories category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/astro-gaming-a50-wireless-headset-base-station-gen-4-compatible-with-ps5-ps4-pc-mac-black-silver.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 138 + }, + { + "sites": [ + "shopping" + ], + "task_id": 239, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I am doing a market survey for one stop market, show me the most expensive product from {{product_category}} category", + "instantiation_dict": { + "product_category": "nutrition bars and drinks" + }, + "intent": "I am doing a market survey for one stop market, show me the most expensive product from nutrition bars and drinks category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/kellogg-s-special-k-protein-meal-bars-chocolate-caramel-12-7oz-6-count.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 138 + }, + { + "sites": [ + "shopping" + ], + "task_id": 240, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I am doing a market survey for one stop market, show me the most expensive product from {{product_category}} category", + "instantiation_dict": { + "product_category": "competitive swimwear" + }, + "intent": "I am doing a market survey for one stop market, show me the most expensive product from competitive swimwear category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/women-cross-flower-beachwear-tankini-bandeau-bandage-bikini-set-push-up-swimwear-bathing-suit-two-pieces-swimsuits.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 138 + }, + { + "sites": [ + "shopping" + ], + "task_id": 241, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I am doing a market survey for one stop market, show me the most expensive product from {{product_category}} category", + "instantiation_dict": { + "product_category": "skin care tool" + }, + "intent": "I am doing a market survey for one stop market, show me the most expensive product from skin care tool category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/professional-medi-spa-scar-stretch-mark-reduction-system.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 138 + }, + { + "sites": [ + "shopping" + ], + "task_id": 242, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I am doing a market survey for one stop market, show me the most expensive product from {{product_category}} category", + "instantiation_dict": { + "product_category": "Household Supplies" + }, + "intent": "I am doing a market survey for one stop market, show me the most expensive product from Household Supplies category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/lynx-battery-12v-200ah-lithium-iron-phosphate-lifepo4-prismatic-deep-cell-battery-set-of-4-3-2v-cells-with-3-bus-bars-and-8-lug-nuts-for-rv-solar-marine-off-grid-applications.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 138 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 243, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the {{information}} of the customer who is the most unhappy with {{product}}", + "instantiation_dict": { + "information": "email address", + "product": "Circe fleece" + }, + "intent": "Show me the email address of the customer who is the most unhappy with Circe fleece", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "hannah.lim@gmail.com" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "hannah.lim@gmail.com" + }, + "intent_template_id": 244 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 244, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the {{information}} of the customer who is the most unhappy with {{product}}", + "instantiation_dict": { + "information": "email address", + "product": "Olivia zip jacket" + }, + "intent": "Show me the email address of the customer who is the most unhappy with Olivia zip jacket", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "emma.lopez@gmail.com" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "emma.lopez@gmail.com" + }, + "intent_template_id": 244 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 245, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the {{information}} of the customer who is the most unhappy with {{product}}", + "instantiation_dict": { + "information": "name", + "product": "Antonia racer tank" + }, + "intent": "Show me the name of the customer who is the most unhappy with Antonia racer tank", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Shaunte" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Shaunte" + }, + "intent_template_id": 244 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 246, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the {{information}} of the customer who is the most unhappy with {{product}}", + "instantiation_dict": { + "information": "name", + "product": "Chloe tank" + }, + "intent": "Show me the name of the customer who is the most unhappy with Chloe tank", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Teofila" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Teofila" + }, + "intent_template_id": 244 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 247, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Show me the {{information}} of the customer who is the most unhappy with {{product}}", + "instantiation_dict": { + "information": "email address", + "product": "the style of Zoe products" + }, + "intent": "Show me the email address of the customer who is the most unhappy with the style of Zoe products", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "Valorie doesn't have a email in the system", + "program_html": [], + "string_note": "There is no negative review for Zoe products", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 244 + }, + { + "sites": [ + "map" + ], + "task_id": 248, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the coordinates of {{location}} in DD format", + "instantiation_dict": { + "location": "Carnegie Mellon Caf\u00e9" + }, + "intent": "Tell me the coordinates of Carnegie Mellon Caf\u00e9 in DD format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "40.442", + "-79.939" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "40.4424191, -79.9397388" + }, + "intent_template_id": 46 + }, + { + "sites": [ + "map" + ], + "task_id": 249, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the coordinates of {{location}} in DD format", + "instantiation_dict": { + "location": "Western Pennsylvania Hospital Heliport" + }, + "intent": "Tell me the coordinates of Western Pennsylvania Hospital Heliport in DD format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "40.460", + "-79.946" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "40.46076, -79.94666" + }, + "intent_template_id": 46 + }, + { + "sites": [ + "map" + ], + "task_id": 250, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the coordinates of {{location}} in DD format", + "instantiation_dict": { + "location": "Apple Store near Pitt" + }, + "intent": "Tell me the coordinates of Apple Store near Pitt in DD format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "40.451", + "-79.933" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "40.4511693, -79.9334241" + }, + "intent_template_id": 46 + }, + { + "sites": [ + "map" + ], + "task_id": 251, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the coordinates of {{location}} in DD format", + "instantiation_dict": { + "location": "bus stop on the Carnegie art museum side of the street near CMU" + }, + "intent": "Tell me the coordinates of bus stop on the Carnegie art museum side of the street near CMU in DD format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "40.444", + "-79.948" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "40.4443, -79.94889" + }, + "intent_template_id": 46 + }, + { + "sites": [ + "map" + ], + "task_id": 252, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Tell me the coordinates of {{location}} in DD format", + "instantiation_dict": { + "location": "Tokyo Japanese Food Store in Pittsburgh" + }, + "intent": "Tell me the coordinates of Tokyo Japanese Food Store in Pittsburgh in DD format", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "40.457", + "-79.929" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "40.45761, -79.92934" + }, + "intent_template_id": 46 + }, + { + "sites": [ + "map" + ], + "task_id": 253, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the {{information}} of {{location}}", + "instantiation_dict": { + "location": "Carnegie Mellon Caf\u00e9", + "information": "phone number" + }, + "intent": "What is the phone number of Carnegie Mellon Caf\u00e9", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no such information in the map", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 501 + }, + { + "sites": [ + "map" + ], + "task_id": 254, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the {{information}} of {{location}}", + "instantiation_dict": { + "location": "Western Pennsylvania Hospital", + "information": "phone number" + }, + "intent": "What is the phone number of Western Pennsylvania Hospital", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": ["4125785000"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "4125785000" + }, + "intent_template_id": 501 + }, + { + "sites": [ + "map" + ], + "task_id": 255, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Who is the {{information}} of {{location}}", + "instantiation_dict": { + "location": "PIT airport", + "information": "operator" + }, + "intent": "Who is the operator of PIT airport", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Allegheny County Airport Authority" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Allegheny County Airport Authority" + }, + "intent_template_id": 501 + }, + { + "sites": [ + "map" + ], + "task_id": 256, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the {{information}} of {{location}}", + "instantiation_dict": { + "location": "Carnegie art museum in pittsburgh", + "information": "website" + }, + "intent": "What is the website of Carnegie art museum in pittsburgh", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "http://web.cmoa.org/" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "http://web.cmoa.org/" + }, + "intent_template_id": 501 + }, + { + "sites": [ + "map" + ], + "task_id": 257, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What is the {{information}} of {{location}}", + "instantiation_dict": { + "location": "Tokyo Japanese Food Store in Pittsburgh", + "information": "hours of operation" + }, + "intent": "What is the hours of operation of Tokyo Japanese Food Store in Pittsburgh", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "We-Su 10:00-17:00" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "We-Su 10:00-17:00" + }, + "intent_template_id": 501 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 258, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "See all public projects", + "instantiation_dict": {}, + "intent": "See all public projects", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/explore", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 325 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 259, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Get me my RSS feed token", + "instantiation_dict": {}, + "intent": "Get me my RSS feed token", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "TMN_bBn9Z48qVbUFZV45" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "TMN_bBn9Z48qVbUFZV45" + }, + "intent_template_id": 312 + }, + { + "sites": [ + "shopping" + ], + "task_id": 260, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I want to browse the products in the {{category}} category", + "instantiation_dict": { + "category": "Video Game" + }, + "intent": "I want to browse the products in the Video Game category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/video-games.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 211 + }, + { + "sites": [ + "shopping" + ], + "task_id": 261, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I want to browse the products in the {{category}} category", + "instantiation_dict": { + "category": "Headphones" + }, + "intent": "I want to browse the products in the Headphones category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/electronics/headphones.html", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/electronics.html?cat=60"}] + }, + "intent_template_id": 211 + }, + { + "sites": [ + "shopping" + ], + "task_id": 262, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I want to browse the products in the {{category}} category", + "instantiation_dict": { + "category": "Men shoes" + }, + "intent": "I want to browse the products in the Men shoes category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/clothing-shoes-jewelry/men/shoes.html", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/clothing-shoes-jewelry.html?cat=145"}] + }, + "intent_template_id": 211 + }, + { + "sites": [ + "shopping" + ], + "task_id": 263, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I want to browse the products in the {{category}} category", + "instantiation_dict": { + "category": "Woman clothing" + }, + "intent": "I want to browse the products in the Woman clothing category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/clothing-shoes-jewelry/women/clothing.html", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/clothing-shoes-jewelry.html?cat=143"}] + }, + "intent_template_id": 211 + }, + { + "sites": [ + "shopping" + ], + "task_id": 264, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I want to browse the products in the {{category}} category", + "instantiation_dict": { + "category": "Cabinets, Racks & Shelves" + }, + "intent": "I want to browse the products in the Cabinets, Racks & Shelves category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/office-products/office-furniture-lighting/cabinets-racks-shelves.html", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/office-products.html?cat=187"}] + }, + "intent_template_id": 211 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 265, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What's the closest national park to {{city}}? How far is it to drive there?", + "instantiation_dict": { + "city": "Boston" + }, + "intent": "What's the closest national park to Boston? How far is it to drive there?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Acadia National Park", + "457km" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Acadia National Park\n457km" + }, + "intent_template_id": 85 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 266, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What's the closest national park to {{city}}?", + "instantiation_dict": { + "city": "the largest city in Maine" + }, + "intent": "What's the closest national park to the largest city in Maine?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Acadia National Park" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Acadia National Park" + }, + "intent_template_id": 85 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 267, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What's the closest national park to {{city}}? How long it takes to drive there?", + "instantiation_dict": { + "city": "the hometown of Stephen King" + }, + "intent": "What's the closest national park to the hometown of Stephen King? How long it takes to drive there?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Acadia National Park" + ], + "fuzzy_match": [ + "1h 23min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Acadia National Park\n1h 23min" + }, + "intent_template_id": 85 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 268, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "What's the closest national park to {{city}}? How long does it take to bike there?", + "instantiation_dict": { + "city": "Vinalhaven, ME" + }, + "intent": "What's the closest national park to Vinalhaven, ME? How long does it take to bike there?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Acadia National Park" + ], + "fuzzy_match": [ + "10h 33min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Acadia National Park\n10h 33min" + }, + "intent_template_id": 85 + }, + { + "sites": [ + "shopping" + ], + "task_id": 269, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me products under ${{price}} in \"{{product_category}}\" category", + "instantiation_dict": { + "price": "25", + "product_category": "women shoes" + }, + "intent": "Show me products under $25 in \"women shoes\" category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/clothing-shoes-jewelry/women/shoes.html?price=0-25", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 139 + }, + { + "sites": [ + "shopping" + ], + "task_id": 270, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me products under ${{price}} in \"{{product_category}}\" category", + "instantiation_dict": { + "price": "30", + "product_category": "men shoes" + }, + "intent": "Show me products under $30 in \"men shoes\" category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/clothing-shoes-jewelry/men/shoes.html?price=0-30", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 139 + }, + { + "sites": [ + "shopping" + ], + "task_id": 271, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me products under ${{price}} in \"{{product_category}}\" category", + "instantiation_dict": { + "price": "46.99", + "product_category": "makeup remover" + }, + "intent": "Show me products under $46.99 in \"makeup remover\" category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/beauty-personal-care/makeup/makeup-remover.html?price=0-46.99", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 139 + }, + { + "sites": [ + "shopping" + ], + "task_id": 272, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me products under ${{price}} in \"{{product_category}}\" category", + "instantiation_dict": { + "price": "78", + "product_category": "children dental care" + }, + "intent": "Show me products under $78 in \"children dental care\" category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/beauty-personal-care/oral-care/children-s-dental-care.html?price=0-78", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 139 + }, + { + "sites": [ + "shopping" + ], + "task_id": 273, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me products under ${{price}} in \"{{product_category}}\" category", + "instantiation_dict": { + "price": "199", + "product_category": "furtiture with accent" + }, + "intent": "Show me products under $199 in \"furtiture with accent\" category", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/home-kitchen/furniture/accent-furniture.html?price=0-199", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 139 + }, + { + "sites": [ + "shopping" + ], + "task_id": 274, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Search for \"{{keyword}}\"", + "instantiation_dict": { + "keyword": "usb wifi" + }, + "intent": "Search for \"usb wifi\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/?q=usb+wifi", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 212 + }, + { + "sites": [ + "shopping" + ], + "task_id": 275, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Search for \"{{keyword}}\"", + "instantiation_dict": { + "keyword": "xbox" + }, + "intent": "Search for \"xbox\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/?q=xbox", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 212 + }, + { + "sites": [ + "shopping" + ], + "task_id": 276, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Search for \"{{keyword}}\"", + "instantiation_dict": { + "keyword": "switch accessories" + }, + "intent": "Search for \"switch accessories\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/?q=switch+accessories", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 212 + }, + { + "sites": [ + "shopping" + ], + "task_id": 277, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Search for \"{{keyword}}\"", + "instantiation_dict": { + "keyword": "batteries for iphone 13" + }, + "intent": "Search for \"batteries for iphone 13\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/?q=iphone+13", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 212 + }, + { + "sites": [ + "shopping" + ], + "task_id": 278, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Search for \"{{keyword}}\"", + "instantiation_dict": { + "keyword": "green tea bag for weight loss" + }, + "intent": "Search for \"green tea bag for weight loss\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/?q=green+tea+bag+for+weight+loss", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 212 + }, + { + "sites": [ + "shopping" + ], + "task_id": 279, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Provide me with the complete names of Bluetooth headphones from Sony, and also share the price range for the available models", + "instantiation_dict": {}, + "intent": "Provide me with the complete names of Bluetooth headphones from Sony, and also share the price range for the available models", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "SONY WH1000XM3 Bluetooth Wireless Noise Canceling Headphones Silver WH-1000XM3/S (Renewed)", + "Sony WH-CH710N/H Wireless Bluetooth Noise Cancelling Headphones", + "Sony WH-1000XM3B Wireless Bluetooth Noise-Canceling Over-Ear Headphones (Black) Basic Headphone Bundle Kit with Stylus", + "Sony Wireless Headphones WH-CH510: Wireless Bluetooth On-Ear Headset with Mic for Phone-Call, Black", + "Sony WHCH710N Wireless Bluetooth Noise Canceling Over-The-Ear Headphones (Black) with Kratos 18W PD Two-Port Power Adapter and Kratos 6-Feet Nylon Braided USB-C Cable Bundle (3 Items)", + "Sony WI-SP500 Wireless in-Ear Sports Headphones, White (WISP500/W)", + "Sony WI-SP510 Extra BASS Wireless in-Ear Headset/Headphones with mic for Phone Call Sports IPX5 Bluetooth, Black (WISP510/B)", + "Sony MDRAS600BT Active Sports Bluetooth Headset (Black)", + "Sony WH-1000XM4 Wireless Noise Canceling Over-Ear Headphones (Black) with Sony WLA-NS7 Wireless TV Adapter Bundle (2 Items)", + "Sony WI-C300 Wireless In-Ear Headphones, Red (WIC300/R)", + "Sony XB950N1 Extra Bass Wireless Noise Canceling Headphones, Black", + "SONY - H900N Hi-Res Noise Cancelling Wireless Headphone Grayish Black Renewed", + "18.99", + "406" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "These models are avaiable: SONY WH1000XM3 Bluetooth Wireless Noise Canceling Headphones Silver WH-1000XM3/S (Renewed) Sony WH-CH710N/H Wireless Bluetooth Noise Cancelling Headphones Sony WH-1000XM3B Wireless Bluetooth Noise-Canceling Over-Ear Headphones (Black) Basic Headphone Bundle Kit with Stylus Sony Wireless Headphones WH-CH510: Wireless Bluetooth On-Ear Headset with Mic for Phone-Call, Black Sony WHCH710N Wireless Bluetooth Noise Canceling Over-The-Ear Headphones (Black) with Kratos 18W PD Two-Port Power Adapter and Kratos 6-Feet Nylon Braided USB-C Cable Bundle (3 Items) Sony WI-SP500 Wireless in-Ear Sports Headphones, White (WISP500/W) Sony WI-SP510 Extra BASS Wireless in-Ear Headset/Headphones with mic for Phone Call Sports IPX5 Bluetooth, Black (WISP510/B) Sony MDRAS600BT Active Sports Bluetooth Headset (Black) Sony WH-1000XM4 Wireless Noise Canceling Over-Ear Headphones (Black) with Sony WLA-NS7 Wireless TV Adapter Bundle (2 Items) Sony WI-C300 Wireless In-Ear Headphones, Red (WIC300/R) Sony XB950N1 Extra Bass Wireless Noise Canceling Headphones, Black SONY - H900N Hi-Res Noise Cancelling Wireless Headphone Grayish Black Renewed The price ranges from $18.99 to $406 " + }, + "intent_template_id": 204 + }, + { + "sites": [ + "shopping" + ], + "task_id": 280, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Provide me with the full names of chargers from Anker, and also share the price range for the available models", + "instantiation_dict": {}, + "intent": "Provide me with the full names of chargers from Anker, and also share the price range for the available models", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Anker USB C Charger 30W, 711 Charger, Compact Fast Charger (Not Foldable) for MacBook Air/iPhone 13/13 Mini/13 Pro/13 Pro Max/12, Galaxy S21, Note 20, iPad Pro, Pixel, and More", + "Anker USB C Charger 40W, 521 Charger (Nano Pro), PIQ 3.0 Durable Compact Fast Charger (Not Foldable) for iPhone 13/13 Mini/13 Pro/13 Pro Max/12, Galaxy, Pixel 4/3, iPad/iPad Mini (Cable Not Included)", + "Anker PowerCore Speed 20000, 20000mAh Qualcomm Quick Charge 3.0 & PowerIQ Portable Charger, with Quick Charge Recharging, Power Bank for Samsung, iPhone, iPad and More, Black (A1278)", + "5Ft Micro-USB Charger Cord Cable Fit for Anker-PowerCore 5000 10000 20100 13000 26800 Mini 3350 Fusion II 15000 Redux 20000 Slim 10000 Astro E1 AC Replacement Power Adapter Supply", + "Anker 10W Max Wireless Charger, 313 Wireless Charger (Pad), Qi-Certified Wireless Charging 7.5W for iPhone 12/12 Pro/12 mini/12 Pro Max, 10W for Galaxy S10 S9 S8, S9 Plus, Note 9 (No AC Adapter)", + "Anker Wireless Charger, 313 Wireless Charger (Stand), Qi-Certified for iPhone 12, 12 Pro Max, SE, 11, 11 Pro, 11 Pro Max, XR, XS Max, 10W Fast-Charging Galaxy S20, S10 (No AC Adapter)", + "USB Charger, Anker Elite Dual Port 24W Wall Charger, PowerPort 2 with PowerIQ and Foldable Plug, for iPhone 11/Xs/XS Max/XR/X/8/7/6/Plus, iPad Pro/Air 2/Mini 3/Mini 4, Samsung S4/S5, and More", + "iPhone 12 Charger [GaN Tech], Anker 30W Compact USB-C Wall Charger with Power Delivery, PowerPort Atom for iPhone 12 / Mini/Pro/Pro Max / 11 / X/XS/XR, iPad Pro, MacBook 12'', Pixel, Galaxy", + "USB C Charger, Anker 30W 2 Port Fast Charger with 18W USB C Power Adapter, Foldable PowerPort PD 2 Charger for iPad Pro, iPhone 11/11 Pro / 11 Pro Max/XS/Max/XR/X, Pixel, Galaxy, and More", + "Anker 40W 5-Port USB Wall Charger, PowerPort 5 for iPhone XS / XS Max / XR / X / 8 / 7 / 6 / Plus, iPad Pro / Air 2 / mini, Galaxy S9 / S8 / Edge / Plus, Note 8 / 7, LG, Nexus, HTC and More, Black (AK-A2124111)", + "Anker Quick Charge 3.0 39W Dual USB Wall Charger, PowerPort Speed 2 for Galaxy S10/S9/S8/Edge/Plus, Note 8/7 and PowerIQ for iPhone Xs/XS Max/XR/X/8/Plus, iPad Pro/Air 2/Mini, LG, Nexus, HTC and More", + "USB C Charger, Anker 20W PIQ 3.0 Fast Charger with Foldable Plug, PowerPort III Charger for iPhone 13/13 Mini/13 Pro/13 Pro Max/12/11, iPad/iPad Mini, MagSafe, and More (Cable Not Included)", + "8.99", + "59.99" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "These models are availiable: Anker USB C Charger 30W, 711 Charger, Compact Fast Charger (Not Foldable) for MacBook Air/iPhone 13/13 Mini/13 Pro/13 Pro Max/12, Galaxy S21, Note 20, iPad Pro, Pixel, and More Anker USB C Charger 40W, 521 Charger (Nano Pro), PIQ 3.0 Durable Compact Fast Charger (Not Foldable) for iPhone 13/13 Mini/13 Pro/13 Pro Max/12, Galaxy, Pixel 4/3, iPad/iPad Mini (Cable Not Included) Anker PowerCore Speed 20000, 20000mAh Qualcomm Quick Charge 3.0 & PowerIQ Portable Charger, with Quick Charge Recharging, Power Bank for Samsung, iPhone, iPad and More, Black (A1278) 5Ft Micro-USB Charger Cord Cable Fit for Anker-PowerCore 5000 10000 20100 13000 26800 Mini 3350 Fusion II 15000 Redux 20000 Slim 10000 Astro E1 AC Replacement Power Adapter Supply Anker 10W Max Wireless Charger, 313 Wireless Charger (Pad), Qi-Certified Wireless Charging 7.5W for iPhone 12/12 Pro/12 mini/12 Pro Max, 10W for Galaxy S10 S9 S8, S9 Plus, Note 9 (No AC Adapter) Anker Wireless Charger, 313 Wireless Charger (Stand), Qi-Certified for iPhone 12, 12 Pro Max, SE, 11, 11 Pro, 11 Pro Max, XR, XS Max, 10W Fast-Charging Galaxy S20, S10 (No AC Adapter) USB Charger, Anker Elite Dual Port 24W Wall Charger, PowerPort 2 with PowerIQ and Foldable Plug, for iPhone 11/Xs/XS Max/XR/X/8/7/6/Plus, iPad Pro/Air 2/Mini 3/Mini 4, Samsung S4/S5, and More iPhone 12 Charger [GaN Tech], Anker 30W Compact USB-C Wall Charger with Power Delivery, PowerPort Atom for iPhone 12 / Mini/Pro/Pro Max / 11 / X/XS/XR, iPad Pro, MacBook 12'', Pixel, Galaxy USB C Charger, Anker 30W 2 Port Fast Charger with 18W USB C Power Adapter, Foldable PowerPort PD 2 Charger for iPad Pro, iPhone 11/11 Pro / 11 Pro Max/XS/Max/XR/X, Pixel, Galaxy, and More Anker 40W 5-Port USB Wall Charger, PowerPort 5 for iPhone XS / XS Max / XR / X / 8 / 7 / 6 / Plus, iPad Pro / Air 2 / mini, Galaxy S9 / S8 / Edge / Plus, Note 8 / 7, LG, Nexus, HTC and More, Black (AK-A2124111) Anker Quick Charge 3.0 39W Dual USB Wall Charger, PowerPort Speed 2 for Galaxy S10/S9/S8/Edge/Plus, Note 8/7 and PowerIQ for iPhone Xs/XS Max/XR/X/8/Plus, iPad Pro/Air 2/Mini, LG, Nexus, HTC and More USB C Charger, Anker 20W PIQ 3.0 Fast Charger with Foldable Plug, PowerPort III Charger for iPhone 13/13 Mini/13 Pro/13 Pro Max/12/11, iPad/iPad Mini, MagSafe, and More (Cable Not Included) Magnetic Wireless Charger, Anker Wireless Charger with 5ft Built-in USB-C Cable, PowerWave Magnetic Pad, 7.5W Charging for iPhone 13 / 13 Pro / 13 Pro Max / 13 mini / 12 / 12 Pro (No AC Adapter) USB C Super Fast Charger, Anker 25W PD Wall Charger Fast Charging for Samsung Galaxy S21/S21+/S21 Ultra/S20/Z Flip/Note20/20 Ultra/Note10/10+/S9/S8/S10e, iPad Pro 12.9, and More (Cable not Included) The price ranges from $8.99 to $59.99" + }, + "intent_template_id": 204 + }, + { + "sites": [ + "shopping" + ], + "task_id": 281, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Please provide me with the complete product names of Oral B brush heads designed for children, along with their corresponding price range per brush", + "instantiation_dict": {}, + "intent": "Please provide me with the complete product names of Oral B brush heads designed for children, along with their corresponding price range per brush", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Oral-B Kids Extra Soft Replacement Brush Heads featuring STAR WARS, 2 count", + "Kids By Oral-b Stages Power Star Wars Replacement Heads 4 Pack", + "3.745", + "6.495" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "These models are availiable: Oral-B Kids Extra Soft Replacement Brush Heads featuring STAR WARS, 2 count Kids By Oral-b Stages Power Star Wars Replacement Heads 4 Pack The price ranges from $3.745 to $6.495 " + }, + "intent_template_id": 204 + }, + { + "sites": [ + "shopping" + ], + "task_id": 282, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List the full product names of slide slippers from Nike and tell me the price range of the available products", + "instantiation_dict": {}, + "intent": "List the full product names of slide slippers from Nike and tell me the price range of the available products", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Nike Men's Air Max Camden Slide Sandal", + "Nike Men's Benassi JDI Fanny Pack Slides", + "Nike Victori One Mens Comfort Slide Cn9675-003 (Midnight Navy/Midnight Navy/White, Numeric_10)", + "Nike Offcourt Slide Mens Bq4639-002 Size 12", + "Nike Jordan Men's Break Slide Red AR6374-602", + "Nike Victori One Slide Mens Style : Dd9559-300", + "Nike Men's Benassi Solarsoft Slide Athletic Sandal (Black/White, numeric_14)", + "Nike Men's Benassi Solarsoft Slide Athletic Sandal (Midnight Navy/Blue, numeric_8)", + "Nike womens Benassi Just Do It", + "27.6", + "90.65" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "These models are availiable: Nike Men's Air Max Camden Slide Sandal Nike Men's Benassi JDI Fanny Pack Slides Nike Victori One Mens Comfort Slide Cn9675-003 (Midnight Navy/Midnight Navy/White, Numeric_10) Nike Offcourt Slide Mens Bq4639-002 Size 12 Nike Jordan Men's Break Slide Red AR6374-602 Nike Victori One Slide Mens Style : Dd9559-300 Nike Men's Benassi Solarsoft Slide Athletic Sandal (Black/White, numeric_14) Nike Men's Benassi Solarsoft Slide Athletic Sandal (Midnight Navy/Blue, numeric_8) Nike womens Benassi Just Do It The price ranges from $27.6 to $90.65" + }, + "intent_template_id": 204 + }, + { + "sites": [ + "shopping" + ], + "task_id": 283, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Look up the most recent models of XBox controllers released between 2020-2021?", + "instantiation_dict": {}, + "intent": "Look up the most recent models of XBox controllers released between 2020-2021?", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/microsoft-xbox-controller-carbon-black-for-series-x-series-s-xbox-one-windows-10-android-ios-bundled-with-dual-port-charging-dock-xbox-controller-skin-voucher-premgear-cloth.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 210 + }, + { + "sites": [ + "shopping" + ], + "task_id": 284, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the least expensive {{product}} with a minimum storage capacity of {{min_storage}}.", + "instantiation_dict": { + "product": "shoe storage", + "min_storage": "12 pairs" + }, + "intent": "Show the least expensive shoe storage with a minimum storage capacity of 12 pairs.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/onlyeasy-over-the-door-shoe-storage-organizer-hanging-shoe-rack-holder-with-24-large-fabric-pockets-22-1-x-61-4-herringbone-grey-mxrodsb1p.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 207 + }, + { + "sites": [ + "shopping" + ], + "task_id": 285, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the least expensive {{product}} with a minimum storage capacity of {{min_storage}}.", + "instantiation_dict": { + "product": "switch card holder", + "min_storage": "15 cards" + }, + "intent": "Show the least expensive switch card holder with a minimum storage capacity of 15 cards.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/game-card-holder-storage-case-for-nintendo-switch-games-or-ps-vita-game-case-or-sd-memory-cards-black.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 207 + }, + { + "sites": [ + "shopping" + ], + "task_id": 286, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the least expensive {{product}} with a minimum storage capacity of {{min_storage}}.", + "instantiation_dict": { + "product": "ssd hard drive", + "min_storage": "1TB" + }, + "intent": "Show the least expensive ssd hard drive with a minimum storage capacity of 1TB.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/external-hard-drive-2tb-ultra-thin-external-hard-drive-2000gb-ultra-high-speed-portable-3-1-type-c-storage-drive-compatible-with-pc-laptop-and-mac-2tb-a1.html", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 207 + }, + { + "sites": [ + "map" + ], + "task_id": 287, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "How much time does it take from Pittsburgh to Philadelphia by car?", + "instantiation_dict": {}, + "intent": "How much time does it take from Pittsburgh to Philadelphia by car?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "5h 47min" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "5h 47min" + }, + "intent_template_id": 47 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 288, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the customer who has the most cancellations in the history", + "instantiation_dict": { + "attribute": "name" + }, + "intent": "Tell me the name of the customer who has the most cancellations in the history", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "Samantha Jones" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Samantha Jones" + }, + "intent_template_id": 234 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 289, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the customer who has the most cancellations in the history", + "instantiation_dict": { + "attribute": "email address, name, phone number" + }, + "intent": "Tell me the email address, name, phone number of the customer who has the most cancellations in the history", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "email: coolcat321@hotmail.com", + "name: Samantha Jones", + "phone number: 3055551212" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "email: coolcat321@hotmail.com name: Samantha Jones phone number: 3055551212" + }, + "intent_template_id": 234 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 290, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the customer who has the most cancellations in the history", + "instantiation_dict": { + "attribute": "product SKUs in the most recent cancelled orders" + }, + "intent": "Tell me the product SKUs in the most recent cancelled orders of the customer who has the most cancellations in the history", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "WSH09-29-White", + "WSH09-28-Green", + "MSH11-34-Blue", + "WP09-29-Purple" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "WSH09-29-White,WSH09-28-Green,MSH11-34-Blue,WP09-29-Purple" + }, + "intent_template_id": 234 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 291, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the customer who has the most cancellations in the history", + "instantiation_dict": { + "attribute": "total spend on products in the most recent cancelled orders" + }, + "intent": "Tell me the total spend on products in the most recent cancelled orders of the customer who has the most cancellations in the history", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "148" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "$148" + }, + "intent_template_id": 234 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 292, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the customer who has the most cancellations in the history", + "instantiation_dict": { + "attribute": "total number of cancellations" + }, + "intent": "Tell me the total number of cancellations of the customer who has the most cancellations in the history", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "9" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "9" + }, + "intent_template_id": 234 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 293, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Show me the command to clone {{repo}} with SSH.", + "instantiation_dict": { + "repo": "Super_Awesome_Robot" + }, + "intent": "Show me the command to clone Super_Awesome_Robot with SSH.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["git clone ssh://git@metis.lti.cs.cmu.edu:2222/convexegg/super_awesome_robot.git"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "git clone ssh://git@metis.lti.cs.cmu.edu:2222/convexegg/super_awesome_robot.git" + }, + "intent_template_id": 329 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 294, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Show me the command to clone {{repo}} with SSH.", + "instantiation_dict": { + "repo": "ChatGPT" + }, + "intent": "Show me the command to clone ChatGPT with SSH.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["git clone ssh://git@metis.lti.cs.cmu.edu:2222/convexegg/chatgpt.git"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "git clone ssh://git@metis.lti.cs.cmu.edu:2222/convexegg/chatgpt.git" + }, + "intent_template_id": 329 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 295, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Show me the command to clone {{repo}} with SSH.", + "instantiation_dict": { + "repo": "metaseq" + }, + "intent": "Show me the command to clone metaseq with SSH.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["git clone ssh://git@metis.lti.cs.cmu.edu:2222/root/metaseq.git"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "git clone ssh://git@metis.lti.cs.cmu.edu:2222/root/metaseq.git" + }, + "intent_template_id": 329 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 296, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Show me the command to clone {{repo}} with SSH.", + "instantiation_dict": { + "repo": "the best GAN python implementation" + }, + "intent": "Show me the command to clone the best GAN python implementation with SSH.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["git clone ssh://git@metis.lti.cs.cmu.edu:2222/eriklindernoren/PyTorch-GAN.git"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "ssh://git@metis.lti.cs.cmu.edu:2222/eriklindernoren/PyTorch-GAN.git" + }, + "intent_template_id": 329 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 297, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Show me the command to clone {{repo}} with SSH.", + "instantiation_dict": { + "repo": "the most stared Covid location tracker" + }, + "intent": "Show me the command to clone the most stared Covid location tracker with SSH.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["git clone ssh://git@metis.lti.cs.cmu.edu:2222/yjlou/2019-nCov.git"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "ssh://git@metis.lti.cs.cmu.edu:2222/yjlou/2019-nCov.git" + }, + "intent_template_id": 329 + }, + { + "sites": [ + "shopping" + ], + "task_id": 298, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the most recent {{status}} order page", + "instantiation_dict": { + "status": "completed" + }, + "intent": "Show the most recent completed order page", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/sales/order/view/order_id/180/", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 180 + }, + { + "sites": [ + "shopping" + ], + "task_id": 299, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the most recent {{status}} order page", + "instantiation_dict": { + "status": "cancelled" + }, + "intent": "Show the most recent cancelled order page", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/sales/order/view/order_id/170/", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 180 + }, + { + "sites": [ + "shopping" + ], + "task_id": 300, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the most recent {{status}} order page", + "instantiation_dict": { + "status": "pending" + }, + "intent": "Show the most recent pending order page", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/sales/order/view/order_id/189/", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 180 + }, + { + "sites": [ + "shopping" + ], + "task_id": 301, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the most recent {{status}} order page", + "instantiation_dict": { + "status": "processing" + }, + "intent": "Show the most recent processing order page", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": {"fuzzy_match": "N/A"}, + "reference_url": "", + "program_html": [], + "string_note": "there is no order in processing" + }, + "intent_template_id": 180 + }, + { + "sites": [ + "shopping" + ], + "task_id": 302, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show the most recent {{status}} order page", + "instantiation_dict": { + "status": "out of delivery" + }, + "intent": "Show the most recent out of delivery order page", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": {"fuzzy_match": "N/A"}, + "reference_url": "", + "program_html": [], + "string_note": "there is no order in processing" + }, + "intent_template_id": 180 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 303, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make {{period}}?", + "instantiation_dict": { + "user": "Kilian", + "period": "durning 2023" + }, + "intent": "How many commits did Kilian make durning 2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "1" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1" + }, + "intent_template_id": 321 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 304, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make {{period}}?", + "instantiation_dict": { + "user": "Eric", + "period": "between Feb 2023 and May 2023" + }, + "intent": "How many commits did Eric make between Feb 2023 and May 2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "14" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "14" + }, + "intent_template_id": 321 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 305, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make {{period}}?", + "instantiation_dict": { + "user": "Philip", + "period": "in 2023/1" + }, + "intent": "How many commits did Philip make in 2023/1?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 321 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 306, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make {{period}}?", + "instantiation_dict": { + "user": "Anthony", + "period": "between 08/2022-09/2022" + }, + "intent": "How many commits did Anthony make between 08/2022-09/2022?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 321 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 307, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "How many commits did {{user}} make {{period}}?", + "instantiation_dict": { + "user": "Nic", + "period": "in April 2021" + }, + "intent": "How many commits did Nic make in April 2021?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "16" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "16" + }, + "intent_template_id": 321 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 308, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me who has made the most contributions, in terms of number of commits, to the {{repo}} project", + "instantiation_dict": { + "repo": "primer/design" + }, + "intent": "Tell me who has made the most contributions, in terms of number of commits, to the primer/design project", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Shawn Allen"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Shawn Allen" + }, + "intent_template_id": 323 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 309, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me who has made the most contributions, in terms of number of commits, to the {{repo}} project", + "instantiation_dict": { + "repo": "thoughtbot/administrate" + }, + "intent": "Tell me who has made the most contributions, in terms of number of commits, to the thoughtbot/administrate project", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Grayson Wright"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Grayson Wright" + }, + "intent_template_id": 323 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 310, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me who has made the most contributions, in terms of number of commits, to the {{repo}} project", + "instantiation_dict": { + "repo": "AndroidSlidingUpPanel" + }, + "intent": "Tell me who has made the most contributions, in terms of number of commits, to the AndroidSlidingUpPanel project", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["tokudu"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "tokudu" + }, + "intent_template_id": 323 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 311, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me who has made the most contributions, in terms of number of commits, to the {{repo}} project", + "instantiation_dict": { + "repo": "Pytorch GAN" + }, + "intent": "Tell me who has made the most contributions, in terms of number of commits, to the Pytorch GAN project", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Erik Linder-Nor\u00e9n"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Erik Linder-Nor\u00e9n" + }, + "intent_template_id": 323 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 312, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Tell me who has made the most contributions, in terms of number of commits, to the {{repo}} project", + "instantiation_dict": { + "repo": "csvkit" + }, + "intent": "Tell me who has made the most contributions, in terms of number of commits, to the csvkit project", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["Christopher Groskopf"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Christopher Groskopf" + }, + "intent_template_id": 323 + }, + { + "sites": [ + "shopping" + ], + "task_id": 313, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Which number to call for the customer service?", + "instantiation_dict": {}, + "intent": "Which number to call for the customer service?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no phone number in the website", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 134 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 314, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "List the {{attribute}} of the top 3 contributors to {{repo}} repo, ranked by the number of commits?", + "instantiation_dict": { + "repo": "prime/design", + "attribute": "name" + }, + "intent": "List the name of the top 3 contributors to prime/design repo, ranked by the number of commits?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Shawn Allen", + "Inayaili Le\u00f3n", + "Aurora Pleguezuelo" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Shawn Allen, Inayaili Le\u00f3n, Aurora Pleguezuelo" + }, + "intent_template_id": 324 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 315, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "List the {{attribute}} of the top 3 contributors to {{repo}} repo, ranked by the number of commits?", + "instantiation_dict": { + "repo": "Pytorch GAN", + "attribute": "email address" + }, + "intent": "List the email address of the top 3 contributors to Pytorch GAN repo, ranked by the number of commits?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "eriklindernoren@live.se", + "eriklindernoren@gmail.com", + "pinnacle.chen@qq.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "eriklindernoren@live.se, eriklindernoren@gmail.com, pinnacle.chen@qq.com" + }, + "intent_template_id": 324 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 316, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "List the {{attribute}} of the top 3 contributors to {{repo}} repo, ranked by the number of commits?", + "instantiation_dict": { + "repo": "facebook's guide on building react apps", + "attribute": "name" + }, + "intent": "List the name of the top 3 contributors to facebook's guide on building react apps repo, ranked by the number of commits?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Ian Sutherland", + "Joe Hadda", + "Dan Abramov" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Ian Sutherland, Joe Hadda, Dan Abramov" + }, + "intent_template_id": 324 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 317, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "List the {{attribute}} of the top 3 contributors to {{repo}} repo, ranked by the number of commits?", + "instantiation_dict": { + "repo": "metaseq", + "attribute": "name and number of commits" + }, + "intent": "List the name and number of commits of the top 3 contributors to metaseq repo, ranked by the number of commits?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Susan Zhang: 70", + "Stephen Roller: 51", + "Peter Albert: 12" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Susan Zhang: 70, Stephen Roller: 51, Peter Albert: 12" + }, + "intent_template_id": 324 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 318, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "List the {{attribute}} of the top 3 contributors to {{repo}} repo, ranked by the number of commits?", + "instantiation_dict": { + "repo": "2019-nCov", + "attribute": "last names" + }, + "intent": "List the last names of the top 3 contributors to 2019-nCov repo, ranked by the number of commits?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Lo", + "Chen", + "Chu" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Lo, Chen, Chu" + }, + "intent_template_id": 324 + }, + { + "sites": [ + "shopping" + ], + "task_id": 319, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much refund I should expect from my order canlled in {{time}}, including shipping fee", + "instantiation_dict": { + "time": "April 2022" + }, + "intent": "How much refund I should expect from my order canlled in April 2022, including shipping fee", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 160 + }, + { + "sites": [ + "shopping" + ], + "task_id": 320, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much refund I should expect from my order canlled in {{time}}, including shipping fee", + "instantiation_dict": { + "time": "Feb 2023" + }, + "intent": "How much refund I should expect from my order canlled in Feb 2023, including shipping fee", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "406.53" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "406.53" + }, + "intent_template_id": 160 + }, + { + "sites": [ + "shopping" + ], + "task_id": 321, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much refund I should expect from my order canlled in {{time}}, including shipping fee", + "instantiation_dict": { + "time": "2022" + }, + "intent": "How much refund I should expect from my order canlled in 2022, including shipping fee", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "3053.97" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "3053.97" + }, + "intent_template_id": 160 + }, + { + "sites": [ + "shopping" + ], + "task_id": 322, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much refund I should expect from my order canlled in {{time}} if I cannot get the shipping fee refunded?", + "instantiation_dict": { + "time": "May 2023" + }, + "intent": "How much refund I should expect from my order canlled in May 2023 if I cannot get the shipping fee refunded?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "350.42" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "350.42" + }, + "intent_template_id": 160 + }, + { + "sites": [ + "shopping" + ], + "task_id": 323, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much refund I should expect from my order canlled in {{time}}? I only kept the AC-DC Adapter and the shop told me that I cannot get the shipping fee back", + "instantiation_dict": { + "time": "2022/03" + }, + "intent": "How much refund I should expect from my order canlled in 2022/03? I only kept the AC-DC Adapter and the shop told me that I cannot get the shipping fee back", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "264.49" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "264.49" + }, + "intent_template_id": 160 + }, + { + "sites": [ + "shopping" + ], + "task_id": 324, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the \"{{product}}\" listings by {{sorting_order}}.", + "instantiation_dict": { + "product": "chairs", + "sorting_order": "ascending price" + }, + "intent": "Show me the \"chairs\" listings by ascending price.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/index/?product_list_order=price&q=chairs&product_list_dir=asc", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 208 + }, + { + "sites": [ + "shopping" + ], + "task_id": 325, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the \"{{product}}\" listings by {{sorting_order}}.", + "instantiation_dict": { + "product": "mouth night guard", + "sorting_order": "descending price" + }, + "intent": "Show me the \"mouth night guard\" listings by descending price.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/index/?q=mouth%20night%20guard%20&product_list_order=price", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 208 + }, + { + "sites": [ + "shopping" + ], + "task_id": 326, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the \"{{product}}\" listings by {{sorting_order}}.", + "instantiation_dict": { + "product": "Canon photo printer", + "sorting_order": "search relevance, from most to least" + }, + "intent": "Show me the \"Canon photo printer\" listings by search relevance, from most to least.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/?q=Canon+photo+printer", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 208 + }, + { + "sites": [ + "shopping" + ], + "task_id": 327, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the \"{{product}}\" listings by {{sorting_order}}.", + "instantiation_dict": { + "product": "iphone 12 phone case", + "sorting_order": "name alphabetically" + }, + "intent": "Show me the \"iphone 12 phone case\" listings by name alphabetically.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/index/?q=%20iphone%2012%20phone%20case&product_list_order=name", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 208 + }, + { + "sites": [ + "shopping" + ], + "task_id": 328, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the \"{{product}}\" listings by {{sorting_order}}.", + "instantiation_dict": { + "product": "iphone 12 phone case", + "sorting_order": "price" + }, + "intent": "Show me the \"iphone 12 phone case\" listings by price.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/catalogsearch/result/index/?product_list_order=price&q=%20iphone%2012%20phone%20case", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 208 + }, + { + "sites": [ + "shopping" + ], + "task_id": 329, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spend {{time}} on shopping at One Stop Market?", + "instantiation_dict": { + "time": "on 4/19/2023" + }, + "intent": "How much I spend on 4/19/2023 on shopping at One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 147 + }, + { + "sites": [ + "shopping" + ], + "task_id": 330, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spend {{time}} on shopping at One Stop Market?", + "instantiation_dict": { + "time": "in March 2023" + }, + "intent": "How much I spend in March 2023 on shopping at One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "83.31" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "81.31" + }, + "intent_template_id": 147 + }, + { + "sites": [ + "shopping" + ], + "task_id": 331, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spend {{time}} on shopping at One Stop Market?", + "instantiation_dict": { + "time": "in July 2022" + }, + "intent": "How much I spend in July 2022 on shopping at One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "40.16" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "40.16" + }, + "intent_template_id": 147 + }, + { + "sites": [ + "shopping" + ], + "task_id": 332, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much I spend {{time}} on shopping at One Stop Market?", + "instantiation_dict": { + "time": "each month from Jan to the end of March 2023" + }, + "intent": "How much I spend each month from Jan to the end of March 2023 on shopping at One Stop Market?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "Jan: 572.8", + "Feb: 762.18", + "Mar: 83.31" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Jan: 572.8\nFeb: 762.18\nMar: 83.31" + }, + "intent_template_id": 147 + }, + { + "sites": [ + "shopping" + ], + "task_id": 333, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "How much did I spend on shopping at One Stop Market {{time}}? They gave me a 20% discount on the total amount for orders exceeding $200 in cash", + "instantiation_dict": { + "time": "on November 2022" + }, + "intent": "How much did I spend on shopping at One Stop Market on November 2022? They gave me a 20% discount on the total amount for orders exceeding $200 in cash", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "359.546" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "359.546" + }, + "intent_template_id": 147 + }, + { + "sites": [ + "shopping" + ], + "task_id": 334, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me when I last ordered my {{description}}?", + "instantiation_dict": { + "description": "muffin cornbread mix" + }, + "intent": "Tell me when I last ordered my muffin cornbread mix?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "March 11th 2023" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "March 11th 2023" + }, + "intent_template_id": 169 + }, + { + "sites": [ + "shopping" + ], + "task_id": 335, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me when I last ordered my {{description}}?", + "instantiation_dict": { + "description": "body butter" + }, + "intent": "Tell me when I last ordered my body butter?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "January 16th 2023" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "January 16th 2023" + }, + "intent_template_id": 169 + }, + { + "sites": [ + "shopping" + ], + "task_id": 336, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me when I last ordered my {{description}}?", + "instantiation_dict": { + "description": "conditioner" + }, + "intent": "Tell me when I last ordered my conditioner?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "January 16th 2023" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "January 16th 2023" + }, + "intent_template_id": 169 + }, + { + "sites": [ + "shopping" + ], + "task_id": 337, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me when I last ordered my {{description}}?", + "instantiation_dict": { + "description": "bread olive" + }, + "intent": "Tell me when I last ordered my bread olive?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "December 12th 2022" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "December 12th 2022" + }, + "intent_template_id": 169 + }, + { + "sites": [ + "shopping" + ], + "task_id": 338, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Tell me when I last ordered my {{description}}?", + "instantiation_dict": { + "description": "toothpaste" + }, + "intent": "Tell me when I last ordered my toothpaste?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "December 4th 2022" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "December 4th 2022" + }, + "intent_template_id": 169 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 339, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "List all opened issues {{description}}", + "instantiation_dict": { + "description": "that report bugs" + }, + "intent": "List all opened issues that report bugs", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues/?label_name%5B%5D=bug", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 299 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 340, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "List all opened issues {{description}}", + "instantiation_dict": { + "description": "that report bugs" + }, + "intent": "List all opened issues that report bugs", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/issues/?label_name%5B%5D=type%3A%20bug%20%F0%9F%90%9E", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 299 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 341, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/root/metaseq", + "geolocation": null, + "intent_template": "List all opened issues {{description}}", + "instantiation_dict": { + "description": "requesting new features" + }, + "intent": "List all opened issues requesting new features", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/root/metaseq/-/issues/?label_name%5B%5D=enhancement", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 299 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 342, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/root/metaseq", + "geolocation": null, + "intent_template": "List all opened issues {{description}}", + "instantiation_dict": { + "description": "that ask about OPT model related questions" + }, + "intent": "List all opened issues that ask about OPT model related questions", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/root/metaseq/-/issues/?search=OPT&label_name%5B%5D=question", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 299 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 343, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/root/metaseq", + "geolocation": null, + "intent_template": "List all opened issues {{description}}", + "instantiation_dict": { + "description": "that don't have any labels" + }, + "intent": "List all opened issues that don't have any labels", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/root/metaseq/-/issues/?label_name%5B%5D=None", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 299 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 344, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "How many reviews our shop received {{time}}?", + "instantiation_dict": { + "time": "by far" + }, + "intent": "How many reviews our shop received by far?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "351" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "351" + }, + "intent_template_id": 248 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 345, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "How many reviews our shop received {{time}}?", + "instantiation_dict": { + "time": "in Apr 2023" + }, + "intent": "How many reviews our shop received in Apr 2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "351" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "351" + }, + "intent_template_id": 248 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 346, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "How many reviews our shop received {{time}}?", + "instantiation_dict": { + "time": "during 2022" + }, + "intent": "How many reviews our shop received during 2022?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 248 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 347, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "How many reviews our shop received {{time}}?", + "instantiation_dict": { + "time": "from the beginning of the shop" + }, + "intent": "How many reviews our shop received from the beginning of the shop?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "351" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "351" + }, + "intent_template_id": 248 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 348, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "How many reviews our shop received {{time}}?", + "instantiation_dict": { + "time": "in May 2023" + }, + "intent": "How many reviews our shop received in May 2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 248 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 349, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Who else have access to my repo {{repo}}, show me their usernames", + "instantiation_dict": { + "repo": "gimmiethat.space" + }, + "intent": "Who else have access to my repo gimmiethat.space, show me their usernames", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "exact_match": "yjlou" + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "yjlou" + }, + "intent_template_id": 298 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 350, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Who else have access to my repo {{repo}}, show me their usernames", + "instantiation_dict": { + "repo": "prism-theme" + }, + "intent": "Who else have access to my repo prism-theme, show me their usernames", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "abisubramanya27" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Abishek S, abisubramanya27" + }, + "intent_template_id": 298 + }, + { + "sites": [ + "shopping" + ], + "task_id": 351, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List products from {{product_category}} category by {{order}} price", + "instantiation_dict": { + "product_category": "PS4 accessories", + "order": "ascending" + }, + "intent": "List products from PS4 accessories category by ascending price", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/video-games/playstation-4/accessories.html?product_list_order=price", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/video-games.html?cat=67&product_list_order=price"}] + }, + "intent_template_id": 137 + }, + { + "sites": [ + "shopping" + ], + "task_id": 352, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List products from {{product_category}} category by {{order}} price", + "instantiation_dict": { + "product_category": "nutrition bars and drinks", + "order": "ascending" + }, + "intent": "List products from nutrition bars and drinks category by ascending price", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/health-household/diet-sports-nutrition/nutrition-bars-drinks.html?product_list_order=price", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/health-household.html?cat=192&product_list_order=price"}] + }, + "intent_template_id": 137 + }, + { + "sites": [ + "shopping" + ], + "task_id": 353, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List products from {{product_category}} category by {{order}} price", + "instantiation_dict": { + "product_category": "competitive swimwear", + "order": "ascending" + }, + "intent": "List products from competitive swimwear category by ascending price", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/clothing-shoes-jewelry/sport-specific-clothing/competitive-swimwear.html?product_list_order=price", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/clothing-shoes-jewelry.html?cat=149&product_list_order=price"}] + }, + "intent_template_id": 137 + }, + { + "sites": [ + "shopping" + ], + "task_id": 354, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List products from {{product_category}} category by {{order}} price", + "instantiation_dict": { + "product_category": "living room furtniture", + "order": "descending" + }, + "intent": "List products from living room furtniture category by descending price", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/home-kitchen/furniture/living-room-furniture.html?product_list_order=price&product_list_dir=desc", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/home-kitchen.html?cat=154&product_list_order=price&product_list_dir=desc"}] + }, + "intent_template_id": 137 + }, + { + "sites": [ + "shopping" + ], + "task_id": 355, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List products from {{product_category}} category by {{order}} price", + "instantiation_dict": { + "product_category": "kids' bedding", + "order": "descending" + }, + "intent": "List products from kids' bedding category by descending price", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/home-kitchen/bedding/kids-bedding.html?product_list_dir=desc", + "program_html": [], + "url_note": "GOLD in PRED", + "or": [{"reference_url": "__SHOPPING__/home-kitchen.html?cat=155&product_list_dir=desc"}] + }, + "intent_template_id": 137 + }, + { + "sites": [ + "map" + ], + "task_id": 356, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show the route from SCS CMU in Pittsburgh to the location where the Declaration of Independence and Constitution were signed", + "instantiation_dict": {}, + "intent": "Show the route from SCS CMU in Pittsburgh to the location where the Declaration of Independence and Constitution were signed", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Gates and Hillman Centers", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Independence Hall", + "Philadelphia" + ] + } + } + ] + }, + "intent_template_id": 49 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 357, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Checkout merge requests requiring my review", + "instantiation_dict": {}, + "intent": "Checkout merge requests requiring my review", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/dashboard/merge_requests?reviewer_username=byteblaze", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 291 + }, + { + "sites": [ + "shopping" + ], + "task_id": 358, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the {{info}} for order number {{order_number}}.", + "instantiation_dict": { + "info": "shipping method", + "order_number": 187 + }, + "intent": "Show me the shipping method for order number 187.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Flat Rate - Fixed" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Flat Rate - Fixed" + }, + "intent_template_id": 206 + }, + { + "sites": [ + "shopping" + ], + "task_id": 359, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the {{info}} for order number {{order_number}}.", + "instantiation_dict": { + "info": "order date", + "order_number": "148" + }, + "intent": "Show me the order date for order number 148.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "1/29/2023" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1/29/2023" + }, + "intent_template_id": 206 + }, + { + "sites": [ + "shopping" + ], + "task_id": 360, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the {{info}} for order number {{order_number}}.", + "instantiation_dict": { + "info": "product names", + "order_number": "148" + }, + "intent": "Show me the product names for order number 148.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Bornbridge Artificial Spiral Topiary Tree - Indoor / Outdoor Topiary Trees - Artificial Outdoor Plants (2 Pack, 4' Cypress)", + "Russound 5B45W 4\" Indoor Outdoor Speakers White" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Bornbridge Artificial Spiral Topiary Tree - Indoor / Outdoor Topiary Trees - Artificial Outdoor Plants (2 Pack, 4' Cypress), Russound 5B45W 4\" Indoor Outdoor Speakers White" + }, + "intent_template_id": 206 + }, + { + "sites": [ + "shopping" + ], + "task_id": 361, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the {{info}} for order number {{order_number}}.", + "instantiation_dict": { + "info": "order statuses", + "order_number": "170 and 189" + }, + "intent": "Show me the order statuses for order number 170 and 189.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": [ + "170: cancelled", + "189: pending" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "170: cancelled, 189: pending" + }, + "intent_template_id": 206 + }, + { + "sites": [ + "shopping" + ], + "task_id": 362, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Show me the {{info}} for order number {{order_number}}.", + "instantiation_dict": { + "info": "billing address", + "order_number": "00178" + }, + "intent": "Show me the billing address for order number 00178.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "101 S San Mateo Dr", + "San Mateo", + "California", + "94010", + "United States" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Emma Lopez, 101 S San Mateo Dr, San Mateo, California, 94010, United States" + }, + "intent_template_id": 206 + }, + { + "sites": [ + "map" + ], + "task_id": 363, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Measure distance between {{location/address_1}} and {{location/address_2}} by walking", + "instantiation_dict": { + "location/address_1": "Carnegie Mellon University", + "location/address_2": "Carnegie Music Hall" + }, + "intent": "Measure distance between Carnegie Mellon University and Carnegie Music Hall by walking", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["778m |OR| 778 m"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "748m" + }, + "intent_template_id": 58 + }, + { + "sites": [ + "map" + ], + "task_id": 364, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Measure distance between {{location/address_1}} and {{location/address_2}} by walking", + "instantiation_dict": { + "location/address_1": "Carnegie Mellon University", + "location/address_2": "UPMC Shadyside" + }, + "intent": "Measure distance between Carnegie Mellon University and UPMC Shadyside by walking", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["1.7km |OR| 1.7 km"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1.7km" + }, + "intent_template_id": 58 + }, + { + "sites": [ + "map" + ], + "task_id": 365, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Measure distance between {{location/address_1}} and {{location/address_2}} by walking", + "instantiation_dict": { + "location/address_1": "Carnegie Music Hall", + "location/address_2": "UPMC Shadyside" + }, + "intent": "Measure distance between Carnegie Music Hall and UPMC Shadyside by walking", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["2.2km |OR| 2.2 km"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "2.2km" + }, + "intent_template_id": 58 + }, + { + "sites": [ + "map" + ], + "task_id": 366, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Measure distance between {{location/address_1}} and {{location/address_2}} by walking", + "instantiation_dict": { + "location/address_1": "CVS (closet one)", + "location/address_2": "UPMC Shadyside" + }, + "intent": "Measure distance between CVS (closet one) and UPMC Shadyside by walking", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["1.2km |OR| 1.2 km"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1.2km" + }, + "intent_template_id": 58 + }, + { + "sites": [ + "map" + ], + "task_id": 367, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Measure distance between {{location/address_1}} and {{location/address_2}} by walking", + "instantiation_dict": { + "location/address_1": "Carnegie Mellon University", + "location/address_2": "CVS (closet one)" + }, + "intent": "Measure distance between Carnegie Mellon University and CVS (closet one) by walking", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": ["1.4km |OR| 1.4 km"] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "1.4km" + }, + "intent_template_id": 58 + }, + { + "sites": [ + "shopping" + ], + "task_id": 368, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "find discounted items.", + "instantiation_dict": {}, + "intent": "find discounted items.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no function to show only discount items", + "reference_answer_raw_annotation": "There is no function to show only discount items." + }, + "intent_template_id": 188 + }, + { + "sites": [ + "map" + ], + "task_id": 369, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Pull up the description page of {{location}} on Map", + "instantiation_dict": { + "location": "Carnegie Music Hall" + }, + "intent": "Pull up the description page of Carnegie Music Hall on Map", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Carnegie Music Hall" + ] + } + } + ] + }, + "intent_template_id": 52 + }, + { + "sites": [ + "map" + ], + "task_id": 370, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Pull up the description page of {{location}} on Map", + "instantiation_dict": { + "location": "Carnegie Mellon University" + }, + "intent": "Pull up the description page of Carnegie Mellon University on Map", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Carnegie Mellon University" + ] + } + } + ] + }, + "intent_template_id": 52 + }, + { + "sites": [ + "map" + ], + "task_id": 371, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Pull up the description page of {{location}} on Map", + "instantiation_dict": { + "location": "Piada restaurant near Pitt" + }, + "intent": "Pull up the description page of Piada restaurant near Pitt on Map", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Piada Italian Street Food", + "Forbes Avenue" + ] + } + } + ] + }, + "intent_template_id": 52 + }, + { + "sites": [ + "map" + ], + "task_id": 372, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Pull up the description page of {{location}} on Map", + "instantiation_dict": { + "location": "the Costco in Pittsburhg near a river" + }, + "intent": "Pull up the description page of the Costco in Pittsburhg near a river on Map", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Costco", + "Waterfront Drive West" + ] + } + } + ] + }, + "intent_template_id": 52 + }, + { + "sites": [ + "map" + ], + "task_id": 373, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Pull up the description page of {{location}} on Map", + "instantiation_dict": { + "location": "Whole Foods near Carnegie Mellon" + }, + "intent": "Pull up the description page of Whole Foods near Carnegie Mellon on Map", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": null, + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Whole Foods", + "East Liberty" + ] + } + } + ] + }, + "intent_template_id": 52 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 374, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Preview the {{name}} theme for my shop", + "instantiation_dict": { + "name": "Magento Blank" + }, + "intent": "Preview the Magento Blank theme for my shop", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/admin/system_design_theme/edit/id/1", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 266 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 375, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Preview the {{name}} theme for my shop", + "instantiation_dict": { + "name": "Magento Luma" + }, + "intent": "Preview the Magento Luma theme for my shop", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/admin/system_design_theme/edit/id/3/key/", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 266 + }, + { + "sites": [ + "shopping" + ], + "task_id": 376, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Summarize customer reviews for {{product}}.", + "instantiation_dict": { + "product": "Amazon Echo Dot 3rd generation" + }, + "intent": "Summarize customer reviews for Amazon Echo Dot 3rd generation.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no review for this product", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 182 + }, + { + "sites": [ + "map" + ], + "task_id": 377, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the {{space}} around {{location}}", + "instantiation_dict": { + "location": "CMU ArtPark Lab", + "space": "resturants" + }, + "intent": "Find the resturants around CMU ArtPark Lab", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__MAP__/search?query=restaurants%20near%20CMU%20ArtPark%20Lab", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 59 + }, + { + "sites": [ + "map" + ], + "task_id": 378, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the {{space}} around {{location}}", + "instantiation_dict": { + "location": "CMU main campus", + "space": "parking" + }, + "intent": "Find the parking around CMU main campus", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__MAP__/search?query=parking%20near%20carnegie%20mellon%20university", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 59 + }, + { + "sites": [ + "map" + ], + "task_id": 379, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the {{space}} around {{location}}", + "instantiation_dict": { + "location": "CMU main campus", + "space": "hotel" + }, + "intent": "Find the hotel around CMU main campus", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__MAP__/search?query=hotels%20near%20carnegie%20mellon%20university", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 59 + }, + { + "sites": [ + "map" + ], + "task_id": 380, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the {{space}} around {{location}}", + "instantiation_dict": { + "location": "Carnegie Music Hall", + "space": "bar" + }, + "intent": "Find the bar around Carnegie Music Hall", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__MAP__/search?query=bars%20near%20Carnegie%20Music%20Hall", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 59 + }, + { + "sites": [ + "map" + ], + "task_id": 381, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the {{space}} around {{location}}", + "instantiation_dict": { + "location": "Carnegie Music Hall", + "space": "hotel" + }, + "intent": "Find the hotel around Carnegie Music Hall", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match" + ], + "reference_answers": null, + "reference_url": "__MAP__/search?query=hotels%20near%20Carnegie%20Music%20Hall", + "program_html": [], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 59 + }, + { + "sites": [ + "map" + ], + "task_id": 382, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I am arriving at Carnegie Mellon University. Find the nearby US Citizenship and Immigration Services and the walking distance to the nearest Social Security Administration from US Citizenship and Immigration Services", + "instantiation_dict": {}, + "intent": "I am arriving at Carnegie Mellon University. Find the nearby US Citizenship and Immigration Services and the walking distance to the nearest Social Security Administration from US Citizenship and Immigration Services", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "There is no USCIS nearby", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 781 + }, + { + "sites": [ + "map" + ], + "task_id": 383, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "I am arriving at Pittsburgh Airport. Show me the name of a Hyatt hotel if there is any nearby. Tell me the names of supermarkets that are within 15mins driving from the hotel", + "instantiation_dict": {}, + "intent": "I am arriving at Pittsburgh Airport. Show me the name of a Hyatt hotel if there is any nearby. Tell me the names of supermarkets that are within 15mins driving from the hotel", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Hyatt Regency Pittsburgh International Airport", + "Giant Eagle", + "ALDI" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Hyatt Regency Pittsburgh International Airport Giant Eagle, ALDI" + }, + "intent_template_id": 782 + }, + { + "sites": [ + "shopping" + ], + "task_id": 384, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List the customer names who complain about the quality of EYZUTAK phone cases", + "instantiation_dict": {}, + "intent": "List the customer names who complain about the quality of EYZUTAK phone cases", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Lisa Lee", + "Evelyn Kurver", + "Amanda", + "N Randall" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Lisa Lee, Evelyn Kurver, Amanda, N Randall" + }, + "intent_template_id": 666 + }, + { + "sites": [ + "shopping" + ], + "task_id": 385, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "List the customer names who thinks EYZUTAK phone cases are of good looking", + "instantiation_dict": {}, + "intent": "List the customer names who thinks EYZUTAK phone cases are of good looking", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Lisa Lee", + "MH", + "Misba009", + "Amanda", + "N Randall", + "Amazon Customer", + "Cally", + "Bethany Robertson" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Lisa Lee, MH, Misba009, Amanda, N Randall, Amazon Customer, Cally, Bethany Robertson" + }, + "intent_template_id": 666 + }, + { + "sites": [ + "shopping" + ], + "task_id": 386, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "What is the rating of {{product}}", + "instantiation_dict": { + "product": "Ugreen lightning to 3.5mm cable" + }, + "intent": "What is the rating of Ugreen lightning to 3.5mm cable. Please round to the nearest whole number", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "65 |OR| 3" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Around 3.1 stars" + }, + "intent_template_id": 1355 + }, + { + "sites": [ + "shopping" + ], + "task_id": 387, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Who gave {{stars}} for phone cases from EYZUTAK", + "instantiation_dict": { + "stars": "4 or 5 stars" + }, + "intent": "Who gave 4 or 5 stars for phone cases from EYZUTAK", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "MH", + "Misba009", + "Amanda", + "Amazon Customer", + "Cally", + "Bethany Robertson" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "MH, Misba009, Amanda, Amazon Customer, Cally, Bethany Robertson, Bethany Robertson" + }, + "intent_template_id": 1356 + }, + { + "sites": [ + "shopping" + ], + "task_id": 388, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Who gave {{stars}} for phone cases from EYZUTAK", + "instantiation_dict": { + "stars": "1 or 2 stars" + }, + "intent": "Who gave 1 or 2 stars for phone cases from EYZUTAK", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Evelyn Kurver", + "N Randall" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Evelyn Kurver, N Randall" + }, + "intent_template_id": 1356 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 389, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Post \"{{content}}\" for the merge request related to {{mr}} in {{repo}} project", + "instantiation_dict": { + "mr": "octovisuals page", + "repo": "primer/design", + "content": "Thanks, working on reviews" + }, + "intent": "Post \"Thanks, working on reviews\" for the merge request related to octovisuals page in primer/design project", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/primer/design/-/merge_requests/450", + "locator": "", + "required_contents": { + "must_include": [ + "Thanks, working on reviews" + ] + } + } + ] + }, + "intent_template_id": 348 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 390, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Post \"{{content}}\" for the merge request related to {{mr}} in {{repo}} project", + "instantiation_dict": { + "mr": "semantic HTML post", + "repo": "a11yproject/a11yproject.com", + "content": "lgtm" + }, + "intent": "Post \"lgtm\" for the merge request related to semantic HTML post in a11yproject/a11yproject.com project", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests/1531", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "exact_match": "lgtm" + } + } + ] + }, + "intent_template_id": 348 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 391, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Post \"{{content}}\" for the merge request related to {{mr}} in {{repo}} project", + "instantiation_dict": { + "mr": "focus edge cases", + "repo": "a11yproject/a11yproject.com", + "content": "close because non reproducible" + }, + "intent": "Post \"close because non reproducible\" for the merge request related to focus edge cases in a11yproject/a11yproject.com project", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests/1265", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "exact_match": "close because non reproducible" + } + } + ] + }, + "intent_template_id": 348 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 392, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Post \"{{content}}\" for the merge request related to {{mr}} in {{repo}} project", + "instantiation_dict": { + "mr": "color ulitity", + "repo": "a11yproject.com", + "content": "Good idea" + }, + "intent": "Post \"Good idea\" for the merge request related to color ulitity in a11yproject.com project", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests/1071", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "exact_match": "Good idea" + } + } + ] + }, + "intent_template_id": 348 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 393, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Post \"{{content}}\" for the merge request related to {{mr}} in {{repo}} project", + "instantiation_dict": { + "mr": "fixing the broken links", + "repo": "byteblaze/empathy-prompts", + "content": "lgtm" + }, + "intent": "Post \"lgtm\" for the merge request related to fixing the broken links in byteblaze/empathy-prompts project", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/empathy-prompts/-/merge_requests/19", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "exact_match": "lgtm" + } + } + ] + }, + "intent_template_id": 348 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 394, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Fork {{repo}}.", + "instantiation_dict": { + "repo": "2019-nCov" + }, + "intent": "Fork 2019-nCov.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/2019-nCov", + "locator": "", + "required_contents": { + "must_include": [ + "2019-nCov" + ] + } + } + ] + }, + "intent_template_id": 352 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 395, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Fork {{repo}}.", + "instantiation_dict": { + "repo": "the Pytorch GAN repo with most stars" + }, + "intent": "Fork the Pytorch GAN repo with most stars.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/PyTorch-GAN", + "locator": "", + "required_contents": { + "must_include": [ + "Pytorch-GAN" + ] + } + } + ] + }, + "intent_template_id": 352 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 396, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Fork {{repo}}.", + "instantiation_dict": { + "repo": "ChatGPT" + }, + "intent": "Fork ChatGPT.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/ChatGPT", + "locator": "", + "required_contents": { + "must_include": [ + "ChatGPT" + ] + } + } + ] + }, + "intent_template_id": 352 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 397, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Fork {{repo}}.", + "instantiation_dict": { + "repo": "MetaSeq" + }, + "intent": "Fork MetaSeq.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/metaseq", + "locator": "", + "required_contents": { + "must_include": [ + "metaseq" + ] + } + } + ] + }, + "intent_template_id": 352 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 398, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Fork {{repo}}.", + "instantiation_dict": { + "repo": "all source repos from Akilesh Kannan" + }, + "intent": "Fork all source repos from Akilesh Kannan", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/SimCache", + "locator": "", + "required_contents": { + "must_include": [ + "SimCache" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/dots", + "locator": "", + "required_contents": { + "must_include": [ + "dots" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/CacheEval", + "locator": "", + "required_contents": { + "must_include": [ + "CacheEval" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/nvidia-patch", + "locator": "", + "required_contents": { + "must_include": [ + "404" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/viewgrades-scraper", + "locator": "", + "required_contents": { + "must_include": [ + "404" + ] + } + } + ] + }, + "intent_template_id": 352 + }, + { + "sites": [ + "reddit" + ], + "task_id": 399, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Change my reddit bio to \"{{content}}\"", + "instantiation_dict": { + "content": "I am a robot" + }, + "intent": "Change my reddit bio to \"I am a robot\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/user/MarvelsGrantMan136", + "locator": "document.querySelector(\".user-bio__biography\").outerText", + "required_contents": { + "exact_match": "I am a robot" + } + } + ] + }, + "intent_template_id": 6 + }, + { + "sites": [ + "reddit" + ], + "task_id": 400, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Change my reddit bio to \"{{content}}\"", + "instantiation_dict": { + "content": "Pro Python Developer with 20 years of Experience" + }, + "intent": "Change my reddit bio to \"Pro Python Developer with 20 years of Experience\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/user/MarvelsGrantMan136", + "locator": "document.querySelector(\".user-bio__biography\").outerText", + "required_contents": { + "exact_match": "Pro Python Developer with 20 years of Experience" + } + } + ] + }, + "intent_template_id": 6 + }, + { + "sites": [ + "reddit" + ], + "task_id": 401, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Change my reddit bio to \"{{content}}\"", + "instantiation_dict": { + "content": "Seeking SDE positions" + }, + "intent": "Change my reddit bio to \"Seeking SDE positions\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/user/MarvelsGrantMan136", + "locator": "document.querySelector(\".user-bio__biography\").outerText", + "required_contents": { + "exact_match": "Seeking SDE positions" + } + } + ] + }, + "intent_template_id": 6 + }, + { + "sites": [ + "reddit" + ], + "task_id": 402, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Change my reddit bio to \"{{content}}\"", + "instantiation_dict": { + "content": "Freelance Web Developer" + }, + "intent": "Change my reddit bio to \"Freelance Web Developer\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/user/MarvelsGrantMan136", + "locator": "document.querySelector(\".user-bio__biography\").outerText", + "required_contents": { + "exact_match": "Freelance Web Developer" + } + } + ] + }, + "intent_template_id": 6 + }, + { + "sites": [ + "reddit" + ], + "task_id": 403, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Change my reddit bio to \"{{content}}\"", + "instantiation_dict": { + "content": "Awesome Prompt Artist" + }, + "intent": "Change my reddit bio to \"Awesome Prompt Artist\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/user/MarvelsGrantMan136", + "locator": "document.querySelector(\".user-bio__biography\").outerText", + "required_contents": { + "exact_match": "Awesome Prompt Artist" + } + } + ] + }, + "intent_template_id": 6 + }, + { + "sites": [ + "reddit" + ], + "task_id": 404, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Upvote the newest post in {{subreddit}} subreddit", + "instantiation_dict": { + "subreddit": "books" + }, + "intent": "Upvote the newest post in books subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/books/124260/adults-reading-to-each-other-out-loud", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 22 + }, + { + "sites": [ + "reddit" + ], + "task_id": 405, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Upvote the newest post in {{subreddit}} subreddit", + "instantiation_dict": { + "subreddit": "DIY" + }, + "intent": "Upvote the newest post in DIY subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/DIY/119019/how-can-i-bring-an-hdmi-cable-from-my-pc-downstairs-to-my-tv", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 22 + }, + { + "sites": [ + "reddit" + ], + "task_id": 406, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Upvote the newest post in {{subreddit}} subreddit", + "instantiation_dict": { + "subreddit": "future technology" + }, + "intent": "Upvote the newest post in future technology subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/Futurology/119517/openai-ceo-it-s-not-funny-that-i-m-afraid-of-the-ai-we-re", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 22 + }, + { + "sites": [ + "reddit" + ], + "task_id": 407, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Upvote the newest post in {{subreddit}} subreddit", + "instantiation_dict": { + "subreddit": "deeplearning" + }, + "intent": "Upvote the newest post in deeplearning subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/deeplearning/124993/meta-s-llama-weights-leaked-on-torrent-and-the-best-thing", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 22 + }, + { + "sites": [ + "reddit" + ], + "task_id": 408, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Upvote the newest post in {{subreddit}} subreddit", + "instantiation_dict": { + "subreddit": "explain like im 5" + }, + "intent": "Upvote the newest post in explain like im 5 subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/explainlikeimfive/39244/eli5-how-does-pinching-a-ribbon-and-sliding-your-finger", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 22 + }, + { + "sites": [ + "reddit" + ], + "task_id": 409, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/books/59421/friendly-reminder-bookshop-org-exists", + "geolocation": null, + "intent_template": "Reply to {{position_description}} in this post with \"{{content_description}}\"", + "instantiation_dict": { + "position_description": "the manager of the website", + "content_description": "thanks! I am a big fan of your website." + }, + "intent": "Reply to the manager of the website in this post with \"thanks! I am a big fan of your website.\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/books/59421/-/comment/1235250", + "locator": "", + "required_contents": { + "must_include": [ + "thanks! I am a big fan of your website." + ] + } + } + ] + }, + "intent_template_id": 23 + }, + { + "sites": [ + "reddit" + ], + "task_id": 410, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/singularity/69404/this-is-how-chatgpt-sees-itself", + "geolocation": null, + "intent_template": "Reply to {{position_description}} in this post with \"{{content_description}}\"", + "instantiation_dict": { + "position_description": "the first reply", + "content_description": "don't panic" + }, + "intent": "Reply to the first reply in this post with \"don't panic\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/singularity/69404/-/comment/1042264", + "locator": "", + "required_contents": { + "must_include": [ + "don't panic" + ] + } + } + ] + }, + "intent_template_id": 23 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 411, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Make the LICENSE of {{repo}} to MIT license.", + "instantiation_dict": { + "repo": "byteblaze/cloud-to-butt" + }, + "intent": "Make the LICENSE of byteblaze/cloud-to-butt to MIT license.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/cloud-to-butt/-/blob/master/LICENSE.txt", + "locator": "", + "required_contents": { + "must_include": [ + "MIT license" + ] + } + } + ] + }, + "intent_template_id": 355 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 412, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Make the LICENSE of {{repo}} to Apache License", + "instantiation_dict": { + "repo": "byteblaze/accessible-html-content-patterns" + }, + "intent": "Make the LICENSE of byteblaze/accessible-html-content-patterns to Apache License", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/accessible-html-content-patterns/-/blob/main/LICENSE", + "locator": "", + "required_contents": { + "must_include": [ + "Apache License", + "http://www.apache.org/licenses/LICENSE-2.0" + ] + } + } + ] + }, + "intent_template_id": 355 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 413, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Make the LICENSE of {{repo}} to one that mandates all copies and derivative works to be under the same license", + "instantiation_dict": { + "repo": "byteblaze/a11y-syntax-highlighting" + }, + "intent": "Make the LICENSE of byteblaze/a11y-syntax-highlighting to one that mandates all copies and derivative works to be under the same license", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/a11y-syntax-highlighting/-/blob/main/LICENSE", + "locator": "", + "required_contents": { + "must_include": [ + "GENERAL PUBLIC LICENSE" + ] + } + } + ] + }, + "intent_template_id": 355 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 414, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Make the LICENSE of {{repo}} to MIT license.", + "instantiation_dict": { + "repo": "byteblaze/dotfiles" + }, + "intent": "Make the LICENSE of byteblaze/dotfiles to MIT license.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/dotfiles/-/blob/main/LICENSE", + "locator": "", + "required_contents": { + "must_include": [ + "MIT license", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." + ] + } + } + ] + }, + "intent_template_id": 355 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 415, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Go to the merge request on {{topic}} I have to review, find if the author of the merge request responded at the end, and reply \"Thank you\" if he did. Otherwise remind him with a simple @.", + "instantiation_dict": { + "topic": "verification functions" + }, + "intent": "Go to the merge request on verification functions I have to review, find if the author of the merge request responded at the end, and reply \"Thank you\" if he did. Otherwise remind him with a simple @.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/a11y-webring.club/-/merge_requests/40", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "must_include": ["@davepgreene"] + } + } + ] + }, + "intent_template_id": 360 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 416, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Go to the merge request on {{topic}} I have to review, find if the author of the merge request responded at the end, and reply \"Thank you\" if he did. Otherwise remind him with a simple @.", + "instantiation_dict": { + "topic": "wcag" + }, + "intent": "Go to the merge request on wcag I have to review, find if the author of the merge request responded at the end, and reply \"Thank you\" if he did. Otherwise remind him with a simple @.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests/1270", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "must_include": ["Thank you"] + } + } + ] + }, + "intent_template_id": 360 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 417, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Go to the merge request on {{topic}} I have to review, find if the author of the merge request responded at the end, and reply \"Thank you\" if he did. Otherwise remind him with a simple @.", + "instantiation_dict": { + "topic": "404 link" + }, + "intent": "Go to the merge request on 404 link I have to review, find if the author of the merge request responded at the end, and reply \"Thank you\" if he did. Otherwise remind him with a simple @.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests/1485", + "locator": "document.querySelector('[id=\"notes-list\"').lastElementChild.querySelector('.timeline-discussion-body').outerText", + "required_contents": { + "must_include": ["@Roshanjossey"] + } + } + ] + }, + "intent_template_id": 360 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 418, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set my gitlab status as {{status}}.", + "instantiation_dict": { + "status": "Busy" + }, + "intent": "Set my gitlab status as Busy.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.cover-title').textContent", + "required_contents": { + "must_include": ["Busy"] + } + } + ] + }, + "intent_template_id": 361 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 419, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set my gitlab status as {{status}}.", + "instantiation_dict": { + "status": "Enjoying life" + }, + "intent": "Set my gitlab status as Enjoying life.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.cover-status').lastChild.textContent", + "required_contents": { + "exact_match": "Enjoying life" + } + } + ] + }, + "intent_template_id": 361 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 420, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set my gitlab status as {{status}}.", + "instantiation_dict": { + "status": "Playing Badminton" + }, + "intent": "Set my gitlab status as Playing Badminton.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.cover-status').lastChild.textContent", + "required_contents": { + "exact_match": "Playing Badminton" + } + } + ] + }, + "intent_template_id": 361 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 421, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set my gitlab status as {{status}}.", + "instantiation_dict": { + "status": "Resting due to leg injury" + }, + "intent": "Set my gitlab status as Resting due to leg injury.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.cover-status').lastChild.textContent", + "required_contents": { + "exact_match": "Resting due to leg injury" + } + } + ] + }, + "intent_template_id": 361 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 422, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set my gitlab status as {{status}}.", + "instantiation_dict": { + "status": "Out of Office" + }, + "intent": "Set my gitlab status as Out of Office.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.cover-status').lastChild.textContent", + "required_contents": { + "exact_match": "Out of Office" + } + } + ] + }, + "intent_template_id": 361 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 423, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Mark all {{brand}} shirts on sale", + "instantiation_dict": { + "brand": "Hollister" + }, + "intent": "Mark all Hollister shirts on sale", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/126/", + "locator": "document.querySelector('input[name=\"product[sale]\"]').value", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 237 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 424, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the place where Mr. Rogers was filmed" + }, + "intent": "Find the page of the place where Mr. Rogers was filmed on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Pittsburgh" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 425, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the longest bridge in the Western hemisphere" + }, + "intent": "Find the page of the longest bridge in the Western hemisphere on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Mackinac Bridge" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 426, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the place in Pennsylvania where a plane crashed during the September 11th attacks" + }, + "intent": "Find the page of the place in Pennsylvania where a plane crashed during the September 11th attacks on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Somerset County" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 427, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the university that has most Turning Award winners" + }, + "intent": "Find the page of the university that has most Turning Award winners on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Massachusetts Institute of Technology" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 428, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the undergrad college of the person who developed the Nash equilibrium" + }, + "intent": "Find the page of the undergrad college of the person who developed the Nash equilibrium on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Carnegie Mellon University" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 429, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the colleges where The Chair was filmed in Pittsburgh" + }, + "intent": "Find the page of the colleges where The Chair was filmed in Pittsburgh on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Chatham University" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 430, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the page of {{description}} on the map.", + "instantiation_dict": { + "description": "the college(s) where The Chair was filmed in Pennsylvania other than the ones in Pittsburgh" + }, + "intent": "Find the page of the college(s) where The Chair was filmed in Pennsylvania other than the ones in Pittsburgh on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sidebar_content\"').outerText", + "required_contents": { + "must_include": [ + "Washington & Jefferson College" + ] + } + } + ] + }, + "intent_template_id": 371 + }, + { + "sites": [ + "shopping" + ], + "task_id": 431, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/tall-pink-taper-candles-4-piece-orange-colored-tapered-candles-gradient-candles-10-6-inches-tall-tie-dye-candle-set-large-dripless-long-burning-candlesticks-two-color-taper-candles-candlesticks.html |AND| __SHOPPING__/spaas-white-taper-candles-4-pack-10-inch-tall-candles-scent-free-premium-wax-candle-sticks-8-hour-long-burning-white-candlesticks-for-home-decoration-wedding-holiday-and-parties.html |AND| __SHOPPING__/white-starfish-wall-candle-sconces-set-of-2-beach-decor-ocean-themed-wall-mount-candleholders-nautical-style-beach-bathroom-decor-coastal-farmhouse-seashell-candle-holders.html", + "geolocation": null, + "intent_template": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "instantiation_dict": {}, + "intent": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/checkout/cart", + "locator": "", + "required_contents": { + "must_include": [ + "SPAAS White Taper Candles - 4 Pack |OR| 10 Inch Tall Candles, Scent-Free Premium Wax Candle Sticks |OR| 8 Hour Long Burning White Candlesticks for Home Decoration, Wedding, Holiday and Parties" + ] + } + } + ] + }, + "intent_template_id": 145 + }, + { + "sites": [ + "shopping" + ], + "task_id": 432, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/ciclon-energy-drink-regular-24-cans-8-3oz.html |AND| __SHOPPING__/v8-energy-healthy-energy-drink-steady-energy-from-black-and-green-tea-pomegranate-blueberry-8-ounce-can-pack-of-24.html", + "geolocation": null, + "intent_template": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "instantiation_dict": {}, + "intent": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/checkout/cart", + "locator": "", + "required_contents": { + "must_include": [ + "V8 +Energy, Healthy Energy Drink, Steady Energy from Black and Green Tea, Pomegranate Blueberry, 8 Ounce Can ,Pack of 24" + ] + } + } + ] + }, + "intent_template_id": 145 + }, + { + "sites": [ + "shopping" + ], + "task_id": 433, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/tazrigo-5pcs-white-dental-resin-brush-pens-dental-shaping-silicone-tooth-tool.html |AND| __SHOPPING__/stylus-pens-for-touch-screens-2-pcs-universal-stylus-2-in-1-2022-updated-touch-screen-pens-for-all-touch-screens-cell-phones-tablets-laptops-with-6-replacement-tips-4-discstips-2-fiber-tips.html", + "geolocation": null, + "intent_template": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "instantiation_dict": {}, + "intent": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/checkout/cart", + "locator": "", + "required_contents": { + "must_include": [ + "Tazrigo 5pcs White Dental Resin Brush Pens Dental Shaping Silicone Tooth Tool" + ] + } + } + ] + }, + "intent_template_id": 145 + }, + { + "sites": [ + "shopping" + ], + "task_id": 434, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/3-pairs-ruffle-socks-lace-ankle-socks-for-girls-frilly-socks-women-decorative.html |AND| __SHOPPING__/viviki-women-glitter-socks-ultrathin-transparent-tulle-lace-socks-no-show-ankle-crew-socks-3-pack.html", + "geolocation": null, + "intent_template": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "instantiation_dict": {}, + "intent": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/checkout/cart", + "locator": "", + "required_contents": { + "must_include": [ + "VIVIKI Women Glitter Socks Ultrathin Transparent Tulle Lace Socks - No Show Ankle Crew Socks 3 Pack" + ] + } + } + ] + }, + "intent_template_id": 145 + }, + { + "sites": [ + "shopping" + ], + "task_id": 435, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/35-ft-hdmi-cable-gearit-pro-series-hdmi-cable-35-feet-high-speed-ethernet-4k-resolution-3d-video-and-arc-audio-return-channel-hdmi-cable-white.html |AND| __SHOPPING__/dp-to-hdmi-cable-6ft-2-pack-fosmon-gold-plated-displayport-to-hdmi-cable-1080p-full-hd-for-pcs-to-hdtv-monitor-projector-with-hdmi-port.html", + "geolocation": null, + "intent_template": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "instantiation_dict": {}, + "intent": "Add the product with the lowest per unit price from my open tabs to the shopping cart", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/checkout/cart", + "locator": "", + "required_contents": { + "must_include": [ + "DP to HDMI Cable 6FT (2 Pack), Fosmon Gold Plated Displayport to HDMI Cable 1080p Full HD for PCs to HDTV, Monitor, Projector with HDMI Port" + ] + } + } + ] + }, + "intent_template_id": 145 + }, + { + "sites": [ + "shopping" + ], + "task_id": 436, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I previously ordered some {{product}} {{time}} and later cancelled. Can you reorder it for me?", + "instantiation_dict": { + "product": "a mattress foundation", + "time": "around Feb or March 2023" + }, + "intent": "I previously ordered some a mattress foundation around Feb or March 2023 and later cancelled. Can you reorder it for me?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B07DFJ5XKH" + ] + } + } + ] + }, + "intent_template_id": 156 + }, + { + "sites": [ + "shopping" + ], + "task_id": 437, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I previously ordered some {{product}} {{time}} and later cancelled. Can you reorder it for me?", + "instantiation_dict": { + "product": "a table lamp", + "time": "in May 2023" + }, + "intent": "I previously ordered some a table lamp in May 2023 and later cancelled. Can you reorder it for me?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B072XS3F6W" + ] + } + } + ] + }, + "intent_template_id": 156 + }, + { + "sites": [ + "shopping" + ], + "task_id": 438, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I previously ordered some {{product}} {{time}} and later cancelled. Can you reorder it for me?", + "instantiation_dict": { + "product": "a TV stand", + "time": "sometime around sep 2022" + }, + "intent": "I previously ordered some a TV stand sometime around sep 2022 and later cancelled. Can you reorder it for me?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B08PVHRRB7" + ] + } + } + ] + }, + "intent_template_id": 156 + }, + { + "sites": [ + "shopping" + ], + "task_id": 439, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I previously ordered some {{product}} {{time}} and later cancelled. Can you reorder it for me?", + "instantiation_dict": { + "product": "a cat t-shirt", + "time": "during 2022" + }, + "intent": "I previously ordered some a cat t-shirt during 2022 and later cancelled. Can you reorder it for me?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B0844BWS76" + ] + } + } + ] + }, + "intent_template_id": 156 + }, + { + "sites": [ + "shopping" + ], + "task_id": 440, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I previously ordered some {{product}} {{time}} and later cancelled. Can you reorder it for me?", + "instantiation_dict": { + "product": "a make up removal kit", + "time": "during summer 2022" + }, + "intent": "I previously ordered some a make up removal kit during summer 2022 and later cancelled. Can you reorder it for me?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B0738JQG6Q" + ] + } + } + ] + }, + "intent_template_id": 156 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 441, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/gimmiethat.space", + "geolocation": null, + "intent_template": "Update the project site's title to \"{{title}}\"", + "instantiation_dict": { + "title": "GIVE ME SPACE" + }, + "intent": "Update the project site's title to \"GIVE ME SPACE\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/index.html", + "locator": "", + "required_contents": { + "must_include": [ + "GIVE ME SPACE" + ] + } + } + ] + }, + "intent_template_id": 308 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 442, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/gimmiethat.space", + "geolocation": null, + "intent_template": "Update the project site's title to \"{{title}}\"", + "instantiation_dict": { + "title": "Welcome to my site" + }, + "intent": "Update the project site's title to \"Welcome to my site\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/index.html", + "locator": "", + "required_contents": { + "must_include": [ + "Welcome to my site" + ] + } + } + ] + }, + "intent_template_id": 308 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 443, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/gimmiethat.space", + "geolocation": null, + "intent_template": "Update the project site's title to \"{{title}}\"", + "instantiation_dict": { + "title": "Not an interesting site" + }, + "intent": "Update the project site's title to \"Not an interesting site\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/index.html", + "locator": "", + "required_contents": { + "must_include": [ + "Not an interesting site" + ] + } + } + ] + }, + "intent_template_id": 308 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 444, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/gimmiethat.space", + "geolocation": null, + "intent_template": "Update the project site's title to \"{{title}}\"", + "instantiation_dict": { + "title": "Title Wanted" + }, + "intent": "Update the project site's title to \"Title Wanted\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/index.html", + "locator": "", + "required_contents": { + "must_include": [ + "Title Wanted" + ] + } + } + ] + }, + "intent_template_id": 308 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 445, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/gimmiethat.space", + "geolocation": null, + "intent_template": "Update the project site's title to \"{{title}}\"", + "instantiation_dict": { + "title": "Hello" + }, + "intent": "Update the project site's title to \"Hello\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/index.html", + "locator": "", + "required_contents": { + "must_include": [ + "Hello" + ] + } + } + ] + }, + "intent_template_id": 308 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 446, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Assign the issue regarding {{issue}} in {{repo}} to {{account}}.", + "instantiation_dict": { + "repo": "a11yproject", + "issue": 404, + "account": "Roshanjossey" + }, + "intent": "Assign the issue regarding 404 in a11yproject to Roshanjossey.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/dashboard/issues?scope=all&state=opened&assignee_username=Roshanjossey", + "locator": "", + "required_contents": { + "must_include": [ + "404s, bad host, timeouts, bad urls for URLs linked from website" + ] + } + } + ] + }, + "intent_template_id": 999 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 447, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Assign the issue regarding {{issue}} in {{repo}} to {{account}}.", + "instantiation_dict": { + "repo": "a11y-webring.club", + "issue": "linking to an accessibility statement", + "account": "Rohan" + }, + "intent": "Assign the issue regarding linking to an accessibility statement in a11y-webring.club to Rohan.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/dashboard/issues?scope=all&state=opened&assignee_username=Seirdy", + "locator": "", + "required_contents": { + "must_include": [ + "linking to an accessibility statement" + ] + } + } + ] + }, + "intent_template_id": 999 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 448, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "set the homepage URL on my GitLab profile to {{url}}", + "instantiation_dict": { + "url": "https://egg.tart.com" + }, + "intent": "set the homepage URL on my GitLab profile to https://egg.tart.com", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.profile-header [itemprop=\"url\"]').outerText", + "required_contents": { + "exact_match": "egg.tart.com" + } + } + ] + }, + "intent_template_id": 331 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 449, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "set the homepage URL on my GitLab profile to {{url}}", + "instantiation_dict": { + "url": "https://helloworld.xyz" + }, + "intent": "set the homepage URL on my GitLab profile to https://helloworld.xyz", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.profile-header [itemprop=\"url\"]').outerText", + "required_contents": { + "exact_match": "helloworld.xyz" + } + } + ] + }, + "intent_template_id": 331 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 450, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "set the homepage URL on my GitLab profile to {{url}}", + "instantiation_dict": { + "url": "a11yproject.contributor.me" + }, + "intent": "set the homepage URL on my GitLab profile to a11yproject.contributor.me", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.profile-header [itemprop=\"url\"]').outerText", + "required_contents": { + "exact_match": "a11yproject.contributor.me" + } + } + ] + }, + "intent_template_id": 331 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 451, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "set the homepage URL on my GitLab profile to {{url}}", + "instantiation_dict": { + "url": "www.byteblaze.com" + }, + "intent": "set the homepage URL on my GitLab profile to www.byteblaze.com", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.profile-header [itemprop=\"url\"]').outerText", + "required_contents": { + "exact_match": "www.byteblaze.com" + } + } + ] + }, + "intent_template_id": 331 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 452, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "set the homepage URL on my GitLab profile to {{url}}", + "instantiation_dict": { + "url": "byteblaze.github.io" + }, + "intent": "set the homepage URL on my GitLab profile to byteblaze.github.io", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze", + "locator": "document.querySelector('.profile-header [itemprop=\"url\"]').outerText", + "required_contents": { + "exact_match": "byteblaze.github.io" + } + } + ] + }, + "intent_template_id": 331 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 453, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Disable {{product}} from the site, they are facing some quality issues.", + "instantiation_dict": { + "product": "Teton pullover hoodie" + }, + "intent": "Disable Teton pullover hoodie from the site, they are facing some quality issues.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/78/", + "locator": "document.querySelector('[name=\"product[status]\"').value", + "required_contents": { + "exact_match": "2" + } + } + ] + }, + "intent_template_id": 242 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 454, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Disable {{product}} from the site, they are facing some quality issues.", + "instantiation_dict": { + "product": "Ryker Tee Crew Neck" + }, + "intent": "Disable Ryker Tee Crew Neck from the site, they are facing some quality issues.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/478/", + "locator": "document.querySelector('[name=\"product[status]\"').value", + "required_contents": { + "exact_match": "2" + } + } + ] + }, + "intent_template_id": 242 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 455, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Disable {{product}} from the site, they are facing some quality issues.", + "instantiation_dict": { + "product": "lHelios Endurance Tank" + }, + "intent": "Disable lHelios Endurance Tank from the site, they are facing some quality issues.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/676/", + "locator": "document.querySelector('[name=\"product[status]\"').value", + "required_contents": { + "exact_match": "2" + } + } + ] + }, + "intent_template_id": 242 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 456, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Disable {{product}} from the site, they are facing some quality issues.", + "instantiation_dict": { + "product": "Cora Pant" + }, + "intent": "Disable Cora Pant from the site, they are facing some quality issues.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1840/", + "locator": "document.querySelector('[name=\"product[status]\"').value", + "required_contents": { + "exact_match": "2" + } + } + ] + }, + "intent_template_id": 242 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 457, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Disable {{product}} from the site, they are facing some quality issues.", + "instantiation_dict": { + "product": "Karmen yoga pants" + }, + "intent": "Disable Karmen yoga pants from the site, they are facing some quality issues.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1819/", + "locator": "document.querySelector('[name=\"product[status]\"').value", + "required_contents": { + "exact_match": "2" + } + } + ] + }, + "intent_template_id": 242 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 458, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1481/", + "geolocation": null, + "intent_template": "{{action}} the price of this product by {{amount}}", + "instantiation_dict": { + "amount": "$5", + "action": "Reduce" + }, + "intent": "Reduce the price of this product by $5", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1481/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "27.00" + } + } + ] + }, + "intent_template_id": 247 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 459, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/237/", + "geolocation": null, + "intent_template": "{{action}} the price of this product by {{amount}}", + "instantiation_dict": { + "amount": "10%", + "action": "Reduce" + }, + "intent": "Reduce the price of this product by 10%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/237/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "62.10" + } + } + ] + }, + "intent_template_id": 247 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 460, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/418/", + "geolocation": null, + "intent_template": "{{action}} the price of this product by {{amount}}", + "instantiation_dict": { + "amount": "15%", + "action": "Reduce" + }, + "intent": "Reduce the price of this product by 15%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/418/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "38.25" + } + } + ] + }, + "intent_template_id": 247 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 461, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/721/", + "geolocation": null, + "intent_template": "{{action}} the price of this product by {{amount}}", + "instantiation_dict": { + "amount": "$11.5", + "action": "Increase" + }, + "intent": "Increase the price of this product by $11.5", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/721/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "29.50" + } + } + ] + }, + "intent_template_id": 247 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 462, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/710/", + "geolocation": null, + "intent_template": "{{action}} the price of this product by {{amount}}", + "instantiation_dict": { + "amount": "10%", + "action": "Increase" + }, + "intent": "Increase the price of this product by 10%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/710/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "19.80" + } + } + ] + }, + "intent_template_id": 247 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 463, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/996/", + "geolocation": null, + "intent_template": "{{action}} the price of this product by {{amount}}", + "instantiation_dict": { + "amount": "15%", + "action": "Increase" + }, + "intent": "Increase the price of this product by 15%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/996/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "36.80" + } + } + ] + }, + "intent_template_id": 247 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 464, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update the product description of {{product}} to highlight the real user positive reviews by quoting the comments", + "instantiation_dict": { + "product": "Antonia Racer Tank" + }, + "intent": "Update the product description of Antonia Racer Tank to highlight the real user positive reviews by quoting the comments", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/../antonia-racer-tank.html", + "locator": "document.querySelector('.data.item.content').outerText + (document.querySelector('.product.attribute.overview [itemprop=\"description\"]')?.outerText || '')", + "required_contents": { + "must_include": [ + "This is in regular rotation at the gym", + "Its colorful and looks kinda cute under my exercise tanks", + "it's very stylish for yoga or something else low impact" + ] + } + } + ] + }, + "intent_template_id": 251 + }, + { + "sites": [ + "shopping" + ], + "task_id": 465, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add {{product}} to my wish list", + "instantiation_dict": { + "product": "Tide PODS Spring Meadow Scent HE Turbo Laundry Detergent Pacs, 81 Count" + }, + "intent": "Add Tide PODS Spring Meadow Scent HE Turbo Laundry Detergent Pacs, 81 Count to my wish list", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "Tide PODS Spring Meadow Scent HE Turbo Laundry Detergent Pacs, 81 Count" + ] + } + } + ] + }, + "intent_template_id": 186 + }, + { + "sites": [ + "shopping" + ], + "task_id": 466, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add {{product}} to my wish list", + "instantiation_dict": { + "product": "2 Hawaiian Bamboo Orchid Roots #zc50 - by Discount Hawaiian Gifts" + }, + "intent": "Add 2 Hawaiian Bamboo Orchid Roots #zc50 - by Discount Hawaiian Gifts to my wish list", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "2 Hawaiian Bamboo Orchid Roots #zc50 - by Discount Hawaiian Gifts" + ] + } + } + ] + }, + "intent_template_id": 186 + }, + { + "sites": [ + "shopping" + ], + "task_id": 467, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add {{product}} to my wish list", + "instantiation_dict": { + "product": "HONGJ Hawaiian Beach Outfits Set for Mens, Summer Tropical Tree Printed Relaxed-fit Hawaii Shirts Shorts 2 Piece Suits" + }, + "intent": "Add HONGJ Hawaiian Beach Outfits Set for Mens, Summer Tropical Tree Printed Relaxed-fit Hawaii Shirts Shorts 2 Piece Suits to my wish list", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "HONGJ Hawaiian Beach Outfits Set for Mens, Summer Tropical Tree Printed Relaxed-fit Hawaii Shirts Shorts 2 Piece Suits" + ] + } + } + ] + }, + "intent_template_id": 186 + }, + { + "sites": [ + "shopping" + ], + "task_id": 468, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add {{product}} to my wish list", + "instantiation_dict": { + "product": "DkRgVNY Lace Spcling Lingerie Womens Sexy Hollow Out Underwear Bodysuit One Piece Snap Crotch Clubwear Teddy Bodysuit" + }, + "intent": "Add DkRgVNY Lace Spcling Lingerie Womens Sexy Hollow Out Underwear Bodysuit One Piece Snap Crotch Clubwear Teddy Bodysuit to my wish list", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "DkRgVNY Lace Spcling Lingerie Womens Sexy Hollow Out Underwear Bodysuit One Piece Snap Crotch Clubwear Teddy Bodysuit" + ] + } + } + ] + }, + "intent_template_id": 186 + }, + { + "sites": [ + "shopping" + ], + "task_id": 469, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add {{product}} to my wish list", + "instantiation_dict": { + "product": "Light Blue Simple Summer New Low Heels Slippers for Women Fashion Chunky Heels Pointed Toe Wine Glasses Sandals Comfortable Walking Shoes Ladies All-Match Sexy Party Shoes" + }, + "intent": "Add Light Blue Simple Summer New Low Heels Slippers for Women Fashion Chunky Heels Pointed Toe Wine Glasses Sandals Comfortable Walking Shoes Ladies All-Match Sexy Party Shoes to my wish list", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "Light Blue Simple Summer New Low Heels Slippers for Women Fashion Chunky Heels Pointed Toe Wine Glasses Sandals Comfortable Walking Shoes Ladies All-Match Sexy Party Shoes" + ] + } + } + ] + }, + "intent_template_id": 186 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 470, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Cancel order {{id}}", + "instantiation_dict": { + "id": "302" + }, + "intent": "Cancel order 302", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/302/", + "locator": "document.querySelector(\"#order_status\").outerText", + "required_contents": { + "exact_match": "Canceled" + } + } + ] + }, + "intent_template_id": 257 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 471, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Cancel order {{id}}", + "instantiation_dict": { + "id": "307" + }, + "intent": "Cancel order 307", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/307/", + "locator": "document.querySelector(\"#order_status\").outerText", + "required_contents": { + "exact_match": "Canceled" + } + } + ] + }, + "intent_template_id": 257 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 472, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Cancel order {{id}}", + "instantiation_dict": { + "id": "299" + }, + "intent": "Cancel order 299", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/299/", + "locator": "document.querySelector(\"#order_status\").outerText", + "required_contents": { + "exact_match": "Canceled" + } + } + ] + }, + "intent_template_id": 257 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 473, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Cancel order {{id}}", + "instantiation_dict": { + "id": "301" + }, + "intent": "Cancel order 301", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/301/", + "locator": "document.querySelector(\"#order_status\").outerText", + "required_contents": { + "exact_match": "Canceled" + } + } + ] + }, + "intent_template_id": 257 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 474, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Cancel order {{id}}", + "instantiation_dict": { + "id": "305" + }, + "intent": "Cancel order 305", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/305/", + "locator": "document.querySelector(\"#order_status\").outerText", + "required_contents": { + "exact_match": "Canceled" + } + } + ] + }, + "intent_template_id": 257 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 475, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set up a new, empty repository with the name {{project_name}}?", + "instantiation_dict": { + "project_name": "chatgpt_plugin" + }, + "intent": "Set up a new, empty repository with the name chatgpt_plugin?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/chatgpt_plugin", + "locator": "", + "required_contents": { + "must_include": [ + "chatgpt_plugin" + ] + } + } + ] + }, + "intent_template_id": 292 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 476, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set up a new, empty repository with the name {{project_name}}?", + "instantiation_dict": { + "project_name": "awesome_llm_reading" + }, + "intent": "Set up a new, empty repository with the name awesome_llm_reading?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/awesome_llm_reading", + "locator": "", + "required_contents": { + "must_include": [ + "awesome_llm_reading" + ] + } + } + ] + }, + "intent_template_id": 292 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 477, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set up a new, empty repository with the name {{project_name}}?", + "instantiation_dict": { + "project_name": "awesome_program_aided_reasoning" + }, + "intent": "Set up a new, empty repository with the name awesome_program_aided_reasoning?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/awesome_program_aided_reasoning", + "locator": "", + "required_contents": { + "must_include": [ + "awesome_program_aided_reasoning" + ] + } + } + ] + }, + "intent_template_id": 292 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 478, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set up a new, empty repository with the name {{project_name}}?", + "instantiation_dict": { + "project_name": "webagent" + }, + "intent": "Set up a new, empty repository with the name webagent?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/webagent", + "locator": "", + "required_contents": { + "must_include": [ + "webagent" + ] + } + } + ] + }, + "intent_template_id": 292 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 479, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Set up a new, empty repository with the name {{project_name}}?", + "instantiation_dict": { + "project_name": "awesome_webagent" + }, + "intent": "Set up a new, empty repository with the name awesome_webagent?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/awesome_webagent", + "locator": "", + "required_contents": { + "must_include": [ + "awesome_webagent" + ] + } + } + ] + }, + "intent_template_id": 292 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 480, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Invite {{collaborator_account_list}} as collaborator to {{repo}}", + "instantiation_dict": { + "collaborator_account_list": "yjlou", + "repo": "solarized-prism-theme" + }, + "intent": "Invite yjlou as collaborator to solarized-prism-theme", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/solarized-prism-theme/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "yjlou" + ] + } + } + ] + }, + "intent_template_id": 293 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 481, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "{{name}} wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "instantiation_dict": { + "name": "Abishek" + }, + "intent": "Abishek wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/dotfiles/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'abisubramanya27')", + "required_contents": { + "must_include": [ + "Guest" + ] + } + } + ] + }, + "intent_template_id": 294 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 482, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "{{name}} wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "instantiation_dict": { + "name": "yjlou" + }, + "intent": "yjlou wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/dotfiles/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'yjlou')", + "required_contents": { + "must_include": [ + "Guest" + ] + } + } + ] + }, + "intent_template_id": 294 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 483, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "{{name}} wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "instantiation_dict": { + "name": "Koushik" + }, + "intent": "Koushik wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/dotfiles/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'koush')", + "required_contents": { + "must_include": [ + "Guest" + ] + } + } + ] + }, + "intent_template_id": 294 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 484, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "{{name}} wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "instantiation_dict": { + "name": "Jakub Klinkovsk\u00fd" + }, + "intent": "Jakub Klinkovsk\u00fd wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/dotfiles/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'lahwaacz')", + "required_contents": { + "must_include": [ + "Guest" + ] + } + } + ] + }, + "intent_template_id": 294 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 485, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "{{name}} wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "instantiation_dict": { + "name": "Vinta" + }, + "intent": "Vinta wants to check my dotfile configurations. Please invite him to the repo as a guest.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/dotfiles/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'vinta')", + "required_contents": { + "must_include": [ + "Guest" + ] + } + } + ] + }, + "intent_template_id": 294 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 486, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Change the page title of \"{{old-heading}}\" page on my site to \"{{heading}}\".", + "instantiation_dict": { + "old-heading": "404 Not Found", + "heading": "Bruh bro you clicked the wrong page" + }, + "intent": "Change the page title of \"404 Not Found\" page on my site to \"Bruh bro you clicked the wrong page\".", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/cms/page/edit/page_id/1/", + "locator": "document.querySelector('input[name=\"title\"').value", + "required_contents": { + "exact_match": "Bruh bro you clicked the wrong page" + } + } + ] + }, + "intent_template_id": 275 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 487, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Change the page title of \"{{old-heading}}\" page on my site to \"{{heading}}\".", + "instantiation_dict": { + "old-heading": "Enable Cookies", + "heading": "Cookie monster coming to your place" + }, + "intent": "Change the page title of \"Enable Cookies\" page on my site to \"Cookie monster coming to your place\".", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/cms/page/edit/page_id/3/", + "locator": "document.querySelector('input[name=\"title\"').value", + "required_contents": { + "exact_match": "Cookie monster coming to your place" + } + } + ] + }, + "intent_template_id": 275 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 488, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Change the page title of \"{{old-heading}}\" page on my site to \"{{heading}}\".", + "instantiation_dict": { + "old-heading": "Home Page", + "heading": "This is the home page!! Leave here!!" + }, + "intent": "Change the page title of \"Home Page\" page on my site to \"This is the home page!! Leave here!!\".", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/cms/page/edit/page_id/2/", + "locator": "document.querySelector('input[name=\"title\"').value", + "required_contents": { + "exact_match": "This is the home page!! Leave here!!" + } + } + ] + }, + "intent_template_id": 275 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 489, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Change the page title of \"{{old-heading}}\" page on my site to \"{{heading}}\".", + "instantiation_dict": { + "old-heading": "Privacy Policy", + "heading": "No privacy policy is needed in this dystopian world" + }, + "intent": "Change the page title of \"Privacy Policy\" page on my site to \"No privacy policy is needed in this dystopian world\".", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/cms/page/edit/page_id/4/", + "locator": "document.querySelector('input[name=\"title\"').value", + "required_contents": { + "exact_match": "No privacy policy is needed in this dystopian world" + } + } + ] + }, + "intent_template_id": 275 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 490, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Change the page title of \"{{old-heading}}\" page on my site to \"{{heading}}\".", + "instantiation_dict": { + "old-heading": "About us", + "heading": "Secret" + }, + "intent": "Change the page title of \"About us\" page on my site to \"Secret\".", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/cms/page/edit/page_id/5/", + "locator": "document.querySelector('input[name=\"title\"').value", + "required_contents": { + "exact_match": "Secret" + } + } + ] + }, + "intent_template_id": 275 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 491, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Notify {{name}} in their most recent pending order with message \"{{message}}\"", + "instantiation_dict": { + "name": "Sarah Miller", + "message": "the order is ready to be shipped soon!" + }, + "intent": "Notify Sarah Miller in their most recent pending order with message \"the order is ready to be shipped soon!\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "System message: We cannot add order history." + }, + "intent_template_id": 280 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 492, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Notify {{name}} in their most recent pending order with message \"{{message}}\"", + "instantiation_dict": { + "name": "Jane Doe", + "message": "sorry we are out of stock, please reorder" + }, + "intent": "Notify Jane Doe in their most recent pending order with message \"sorry we are out of stock, please reorder\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/302/", + "locator": "document.querySelector(\"#order_history_block\").querySelector(\".note-list\").firstElementChild.querySelector(\".note-list-comment\").outerText", + "required_contents": { + "exact_match": "sorry we are out of stock, please reorder" + } + } + ] + }, + "intent_template_id": 280 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 493, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Notify {{name}} in their most recent pending order with message \"{{message}}\"", + "instantiation_dict": { + "name": "Grace Nguyen", + "message": "sorry we are bankrupt, please contact our customer service for refund" + }, + "intent": "Notify Grace Nguyen in their most recent pending order with message \"sorry we are bankrupt, please contact our customer service for refund\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/307/", + "locator": "document.querySelector(\"#order_history_block\").querySelector(\".note-list\").firstElementChild.querySelector(\".note-list-comment\").outerText", + "required_contents": { + "exact_match": "sorry we are bankrupt, please contact our customer service for refund" + } + } + ] + }, + "intent_template_id": 280 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 494, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Notify {{name}} in their most recent pending order with message \"{{message}}\"", + "instantiation_dict": { + "name": "Alex Thomas", + "message": "Yo, your order will be shipped soon!" + }, + "intent": "Notify Alex Thomas in their most recent pending order with message \"Yo, your order will be shipped soon!\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/304/", + "locator": "document.querySelector(\"#order_history_block\").querySelector(\".note-list\").firstElementChild.querySelector(\".note-list-comment\").outerText", + "required_contents": { + "exact_match": "Yo, your order will be shipped soon!" + } + } + ] + }, + "intent_template_id": 280 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 495, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Notify {{name}} in their most recent pending order with message \"{{message}}\"", + "instantiation_dict": { + "name": "Lily Potter", + "message": "Thanks, your order is ready to be shipped!" + }, + "intent": "Notify Lily Potter in their most recent pending order with message \"Thanks, your order is ready to be shipped!\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/303/", + "locator": "document.querySelector(\"#order_history_block\").querySelector(\".note-list\").firstElementChild.querySelector(\".note-list-comment\").outerText", + "required_contents": { + "exact_match": "Thanks, your order is ready to be shipped!" + } + } + ] + }, + "intent_template_id": 280 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 496, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update order #{{order}} with the {{service}} tracking number {{tracking}}", + "instantiation_dict": { + "tracking": "8974568499", + "order": "299", + "service": "Federal Express" + }, + "intent": "Update order #299 with the Federal Express tracking number 8974568499", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/commentsHistory/order_id/299/active_tab/order_shipments/", + "locator": "", + "required_contents": { + "must_include": [ + "Tracking number 8974568499 for Federal Express assigned" + ] + } + } + ] + }, + "intent_template_id": 284 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 497, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update order #{{order}} with the {{service}} tracking number {{tracking}}", + "instantiation_dict": { + "tracking": "24353446464", + "order": "307", + "service": "DHL" + }, + "intent": "Update order #307 with the DHL tracking number 24353446464", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/commentsHistory/order_id/307/active_tab/order_shipments/", + "locator": "", + "required_contents": { + "must_include": [ + "Tracking number 24353446464 for DHL assigned" + ] + } + } + ] + }, + "intent_template_id": 284 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 498, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update order #{{order}} with the {{service}} tracking number {{tracking}}", + "instantiation_dict": { + "tracking": "55591023930", + "order": "306", + "service": "UPS" + }, + "intent": "Update order #306 with the UPS tracking number 55591023930", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/commentsHistory/order_id/306/active_tab/order_shipments/", + "locator": "", + "required_contents": { + "must_include": [ + "Tracking number 55591023930 for United Parcel Service assigned" + ] + } + } + ] + }, + "intent_template_id": 284 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 499, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update order #{{order}} with the {{service}} tracking number {{tracking}}", + "instantiation_dict": { + "tracking": "13849373987", + "order": "304", + "service": "USPS" + }, + "intent": "Update order #304 with the USPS tracking number 13849373987", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/commentsHistory/order_id/304/active_tab/order_shipments/", + "locator": "", + "required_contents": { + "must_include": [ + "Tracking number 13849373987 for United States Postal Service assigned" + ] + } + } + ] + }, + "intent_template_id": 284 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 500, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update order #{{order}} with the {{service}} tracking number {{tracking}}", + "instantiation_dict": { + "tracking": "239028439840", + "order": "301", + "service": "DHL" + }, + "intent": "Update order #301 with the DHL tracking number 239028439840", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/commentsHistory/order_id/301/active_tab/order_shipments/", + "locator": "", + "required_contents": { + "must_include": [ + "Tracking number 239028439840 for DHL assigned" + ] + } + } + ] + }, + "intent_template_id": 284 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 501, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Make all {{product}} as out of stock", + "instantiation_dict": { + "product": "Taurus Elements Shell" + }, + "intent": "Make all Taurus Elements Shell as out of stock", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/350/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][is_in_stock]\"').value", + "required_contents": { + "exact_match": "0" + } + } + ] + }, + "intent_template_id": 287 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 502, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Make all {{product}} as out of stock", + "instantiation_dict": { + "product": "Gobi HeatTec Tee" + }, + "intent": "Make all Gobi HeatTec Tee as out of stock", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/446/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][is_in_stock]\"').value", + "required_contents": { + "exact_match": "0" + } + } + ] + }, + "intent_template_id": 287 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 503, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Make all {{product}} as out of stock", + "instantiation_dict": { + "product": "rocco gym tank" + }, + "intent": "Make all rocco gym tank as out of stock", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/682/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][is_in_stock]\"').value", + "required_contents": { + "exact_match": "0" + } + } + ] + }, + "intent_template_id": 287 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 504, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Make all {{product}} as out of stock", + "instantiation_dict": { + "product": "Selene yoga hoodie" + }, + "intent": "Make all Selene yoga hoodie as out of stock", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1108/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][is_in_stock]\"').value", + "required_contents": { + "exact_match": "0" + } + } + ] + }, + "intent_template_id": 287 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 505, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Make all {{product}} as out of stock", + "instantiation_dict": { + "product": "Aeno capri" + }, + "intent": "Make all Aeno capri as out of stock", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1861/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][is_in_stock]\"').value", + "required_contents": { + "exact_match": "0" + } + } + ] + }, + "intent_template_id": 287 + }, + { + "sites": [ + "shopping" + ], + "task_id": 506, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the highest rated product from the {{product_category}} category within a budget {{dollar_value}}.", + "instantiation_dict": { + "product_category": "meat substitute", + "dollar_value": "between 100 and 200" + }, + "intent": "Buy the highest rated product from the meat substitute category within a budget between 100 and 200.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B01CTR3DLE" + ] + } + } + ] + }, + "intent_template_id": 172 + }, + { + "sites": [ + "shopping" + ], + "task_id": 507, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the highest rated product from the {{product_category}} category within a budget {{dollar_value}}.", + "instantiation_dict": { + "product_category": "Ceiling light", + "dollar_value": "above 1000" + }, + "intent": "Buy the highest rated product from the Ceiling light category within a budget above 1000.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B07BVL3P1V" + ] + } + } + ] + }, + "intent_template_id": 172 + }, + { + "sites": [ + "shopping" + ], + "task_id": 508, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the highest rated product from the {{product_category}} category within a budget {{dollar_value}}.", + "instantiation_dict": { + "product_category": "NS switch pouch", + "dollar_value": "under 60" + }, + "intent": "Buy the highest rated product from the NS switch pouch category within a budget under 60.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B07116LGP6" + ] + } + } + ] + }, + "intent_template_id": 172 + }, + { + "sites": [ + "shopping" + ], + "task_id": 509, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the best rating product from \"{{category}}\" category with at least 5 reviews and the product is least expensive", + "instantiation_dict": { + "category": "Men's shoe" + }, + "intent": "Buy the best rating product from \"Men's shoe\" category with at least 5 reviews and the product is least expensive", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B01J4MM3KO" + ] + } + } + ] + }, + "intent_template_id": 216 + }, + { + "sites": [ + "shopping" + ], + "task_id": 510, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the best rating product from \"{{category}}\" category with at least 5 reviews and the product is least expensive", + "instantiation_dict": { + "category": "Home Audio Speaker" + }, + "intent": "Buy the best rating product from \"Home Audio Speaker\" category with at least 5 reviews and the product is least expensive", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "func:shopping_get_latest_order_url()", + "locator": "document.querySelector(\".order-details-items.ordered\").outerText", + "required_contents": { + "must_include": [ + "B002R5ABIW" + ] + } + } + ] + }, + "intent_template_id": 216 + }, + { + "sites": [ + "shopping" + ], + "task_id": 511, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add a {{product}} to my wish list.", + "instantiation_dict": { + "product": "laundry detergent" + }, + "intent": "Add a laundry detergent to my wish list.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "laundry", + "detergent" + ] + } + } + ] + }, + "intent_template_id": 189 + }, + { + "sites": [ + "shopping" + ], + "task_id": 512, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add a {{product}} to my wish list.", + "instantiation_dict": { + "product": "toothpaste" + }, + "intent": "Add a toothpaste to my wish list.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "toothpaste" + ] + } + } + ] + }, + "intent_template_id": 189 + }, + { + "sites": [ + "shopping" + ], + "task_id": 513, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add a {{product}} to my wish list.", + "instantiation_dict": { + "product": "chair" + }, + "intent": "Add a chair to my wish list.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "chair" + ] + } + } + ] + }, + "intent_template_id": 189 + }, + { + "sites": [ + "shopping" + ], + "task_id": 514, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add a {{product}} to my wish list.", + "instantiation_dict": { + "product": "white desk" + }, + "intent": "Add a white desk to my wish list.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "white", + "desk" + ] + } + } + ] + }, + "intent_template_id": 189 + }, + { + "sites": [ + "shopping" + ], + "task_id": 515, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Add a {{product}} to my wish list.", + "instantiation_dict": { + "product": "white computer desk" + }, + "intent": "Add a white computer desk to my wish list.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "white", + "computer", + "desk" + ] + } + } + ] + }, + "intent_template_id": 189 + }, + { + "sites": [ + "shopping" + ], + "task_id": 516, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/elmwood-inn-fine-teas-orange-vanilla-caffeine-free-fruit-infusion-16-ounce-pouch.html", + "geolocation": null, + "intent_template": "Add this product to my wishlist", + "instantiation_dict": {}, + "intent": "Add this product to my wishlist", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "Elmwood Inn Fine Teas, Orange Vanilla Caffeine-free Fruit Infusion, 16-Ounce Pouch" + ] + } + } + ] + }, + "intent_template_id": 196 + }, + { + "sites": [ + "shopping" + ], + "task_id": 517, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/skinit-decal-gaming-skin-compatible-with-xbox-one-s-console-and-controller-bundle-officially-licensed-nfl-baltimore-ravens-design.html", + "geolocation": null, + "intent_template": "Add this product to my wishlist", + "instantiation_dict": {}, + "intent": "Add this product to my wishlist", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "Skinit Decal Gaming Skin Compatible with Xbox One S Console and Controller Bundle - Officially Licensed NFL Baltimore Ravens Design" + ] + } + } + ] + }, + "intent_template_id": 196 + }, + { + "sites": [ + "shopping" + ], + "task_id": 518, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/sceptre-e195bd-srr-19-inch-720p-led-tv-true-black-2017.html", + "geolocation": null, + "intent_template": "Add this product to my wishlist", + "instantiation_dict": {}, + "intent": "Add this product to my wishlist", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "Sceptre E195BD-SRR 19-Inch 720P LED TV, True Black (2017)" + ] + } + } + ] + }, + "intent_template_id": 196 + }, + { + "sites": [ + "shopping" + ], + "task_id": 519, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/iphone-13-pro-max-case-neon-turtle-iphone-13-pro-max-cases-tempered-glass-back-soft-silicone-tpu-shock-protective-case-for-apple-iphone-13-pro-max.html", + "geolocation": null, + "intent_template": "Add this product to my wishlist", + "instantiation_dict": {}, + "intent": "Add this product to my wishlist", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "iPhone 13 Pro Max Case, Neon Turtle iPhone 13 Pro Max Cases, Tempered Glass Back+Soft Silicone TPU Shock Protective Case for Apple iPhone 13 Pro Max" + ] + } + } + ] + }, + "intent_template_id": 196 + }, + { + "sites": [ + "shopping" + ], + "task_id": 520, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__/magnetic-metal-stainless-steel-d-pads-kits-directional-pad-replacement-parts-for-xbox-one-elite-controller-elite-series-2-xbox-one-xbox-one-s-x-controller.html", + "geolocation": null, + "intent_template": "Add this product to my wishlist", + "instantiation_dict": {}, + "intent": "Add this product to my wishlist", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/wishlist/", + "locator": "document.querySelector('.products-grid.wishlist').outerText", + "required_contents": { + "must_include": [ + "Magnetic Metal Stainless Steel D-pads Kits Directional Pad Replacement Parts for Xbox One Elite Controller, Elite Series 2, Xbox One, Xbox One S/X Controller" + ] + } + } + ] + }, + "intent_template_id": 196 + }, + { + "sites": [ + "shopping" + ], + "task_id": 521, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Subscribe to the newsletter of OneStopMarket", + "instantiation_dict": {}, + "intent": "Subscribe to the newsletter of OneStopMarket", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/newsletter/manage/", + "locator": "document.querySelector('[title=\"General Subscription\"').checked.toString()", + "required_contents": { + "exact_match": "true" + } + } + ] + }, + "intent_template_id": 199 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 522, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Fork {{repo}}.", + "instantiation_dict": { + "repo": "all repos from facebook" + }, + "intent": "Fork all repos from facebook.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/dashboard/projects", + "locator": "document.querySelector('[data-qa-selector=\"projects_list\"').outerText", + "required_contents": { + "must_include": [ + "create-react-app", + "buck" + ] + } + } + ] + }, + "intent_template_id": 352 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 523, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Star the top {{number}} most stared repos in Gitlab", + "instantiation_dict": { + "number": "five" + }, + "intent": "Star the top five most stared repos in Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/starred", + "locator": "", + "required_contents": { + "must_include": [ + "AndroidSlidingUpPanel", + "create-react-app", + "ffmpeg-python", + "PHP_XLSXWriter", + "AndroidAsync" + ] + } + } + ] + }, + "intent_template_id": 354 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 524, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Star the top {{number}} most stared repos in Gitlab", + "instantiation_dict": { + "number": "eight" + }, + "intent": "Star the top eight most stared repos in Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/starred", + "locator": "", + "required_contents": { + "must_include": [ + "AndroidSlidingUpPanel", + "create-react-app", + "ffmpeg-python", + "PHP_XLSXWriter", + "AndroidAsync", + "Pytorch-GAN", + "administrate", + "keycloak" + ] + } + } + ] + }, + "intent_template_id": 354 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 525, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Star the top {{number}} most stared repos in Gitlab", + "instantiation_dict": { + "number": "four" + }, + "intent": "Star the top four most stared repos in Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/starred", + "locator": "", + "required_contents": { + "must_include": [ + "AndroidSlidingUpPanel", + "create-react-app", + "ffmpeg-python", + "PHP_XLSXWriter" + ] + } + } + ] + }, + "intent_template_id": 354 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 526, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Star the top {{number}} most stared repos in Gitlab", + "instantiation_dict": { + "number": "three" + }, + "intent": "Star the top three most stared repos in Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/starred", + "locator": "", + "required_contents": { + "must_include": [ + "AndroidSlidingUpPanel", + "create-react-app", + "ffmpeg-python" + ] + } + } + ] + }, + "intent_template_id": 354 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 527, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Star the top {{number}} most stared repos in Gitlab", + "instantiation_dict": { + "number": "one" + }, + "intent": "Star the top one most stared repos in Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/starred", + "locator": "", + "required_contents": { + "must_include": [ + "AndroidSlidingUpPanel" + ] + } + } + ] + }, + "intent_template_id": 354 + }, + { + "sites": [ + "shopping" + ], + "task_id": 528, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft a refund message via their \"contact us\" form for the {{product}} I bought {{time}}. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "instantiation_dict": { + "product": "phone screen protector", + "time": "March 2023" + }, + "intent": "Draft a refund message via their \"contact us\" form for the phone screen protector I bought March 2023. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "000000180", + "12.99" + ] + } + } + ] + }, + "intent_template_id": 154 + }, + { + "sites": [ + "shopping" + ], + "task_id": 529, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft a refund message via their \"contact us\" form for the {{product}} I bought {{time}}. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "instantiation_dict": { + "product": "bluetooth speaker", + "time": "Feb 2023" + }, + "intent": "Draft a refund message via their \"contact us\" form for the bluetooth speaker I bought Feb 2023. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "000000148", + "169.95" + ] + } + } + ] + }, + "intent_template_id": 154 + }, + { + "sites": [ + "shopping" + ], + "task_id": 530, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft a refund message via their \"contact us\" form for the {{product}} I bought {{time}}. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "instantiation_dict": { + "product": "kitchen organizer", + "time": "around Feb 2023" + }, + "intent": "Draft a refund message via their \"contact us\" form for the kitchen organizer I bought around Feb 2023. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "000000161", + "68.88" + ] + } + } + ] + }, + "intent_template_id": 154 + }, + { + "sites": [ + "shopping" + ], + "task_id": 531, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft a refund message via their \"contact us\" form for the {{product}} I bought {{time}}. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "instantiation_dict": { + "product": "phone case", + "time": "March 2023" + }, + "intent": "Draft a refund message via their \"contact us\" form for the phone case I bought March 2023. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "000000180", + "$12.99" + ] + } + } + ] + }, + "intent_template_id": 154 + }, + { + "sites": [ + "shopping" + ], + "task_id": 532, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft a refund message via their \"contact us\" form for the {{product}} I bought {{time}}. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "instantiation_dict": { + "product": "PS3 remote controller", + "time": "early 2023" + }, + "intent": "Draft a refund message via their \"contact us\" form for the PS3 remote controller I bought early 2023. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message. Don't submit yet", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "000000180", + "1.63" + ] + } + } + ] + }, + "intent_template_id": 154 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 533, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Follow {{account_list}} on Gitlab", + "instantiation_dict": { + "account_list": [ + "convexegg", + "yjlou" + ] + }, + "intent": "Follow ['convexegg', 'yjlou'] on Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/following", + "locator": "document.querySelector('.user-profile').outerText", + "required_contents": { + "must_include": [ + "@convexegg", + "@yjlou" + ] + } + } + ] + }, + "intent_template_id": 330 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 534, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Follow {{account_list}} on Gitlab", + "instantiation_dict": { + "account_list": [ + "Jakub Klinkovsk\u00fd", + "Koushik", + "Vinta Chen" + ] + }, + "intent": "Follow ['Jakub Klinkovsk\u00fd', 'Koushik', 'Vinta Chen'] on Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/following", + "locator": "document.querySelector('.user-profile').outerText", + "required_contents": { + "must_include": [ + "@lahwaacz", + "@koush", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 330 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 535, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Follow {{account_list}} on Gitlab", + "instantiation_dict": { + "account_list": [ + "Jakub K", + "ghost", + "Beno\u00eet Blanchon" + ] + }, + "intent": "Follow ['Jakub K', 'ghost', 'Beno\u00eet Blanchon'] on Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/following", + "locator": "document.querySelector('.user-profile').outerText", + "required_contents": { + "must_include": [ + "@lahwaacz", + "@ghost", + "@bblanchon" + ] + } + } + ] + }, + "intent_template_id": 330 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 536, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Follow {{account_list}} on Gitlab", + "instantiation_dict": { + "account_list": [ + "ghost", + "R1kk3r", + "Abishek" + ] + }, + "intent": "Follow ['ghost', 'R1kk3r', 'Abishek'] on Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/following", + "locator": "document.querySelector('.user-profile').outerText", + "required_contents": { + "must_include": [ + "@lahwaacz", + "@R1kk3r", + "@abisubramanya27" + ] + } + } + ] + }, + "intent_template_id": 330 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 537, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Follow {{account_list}} on Gitlab", + "instantiation_dict": { + "account_list": [ + "Jakub Klinkovsk", + "convexegg", + "Vinta Chen", + "yjlou", + "Abishek S" + ] + }, + "intent": "Follow ['Jakub Klinkovsk', 'convexegg', 'Vinta Chen', 'yjlou', 'Abishek S'] on Gitlab", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/users/byteblaze/following", + "locator": "document.querySelector('.user-profile').outerText", + "required_contents": { + "must_include": [ + "@lahwaacz", + "@convexegg", + "@vinta", + "@yjlou", + "@abisubramanya27" + ] + } + } + ] + }, + "intent_template_id": 330 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 538, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Modify the address of order #{{order_id}} to {{address}}", + "instantiation_dict": { + "order_id": "299", + "address": "456 Oak Avenue, Apartment 5B, New York, NY, 10001" + }, + "intent": "Modify the address of order #299 to 456 Oak Avenue, Apartment 5B, New York, NY, 10001", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/299", + "locator": "", + "required_contents": { + "must_include": [ + "456 Oak Avenue", + "Apartment 5B", + "New York", + "10001" + ] + } + } + ] + }, + "intent_template_id": 240 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 539, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Modify the address of order #{{order_id}} to {{address}}", + "instantiation_dict": { + "order_id": "65", + "address": "789 Pine Lane, San Francisco, CA, 94102" + }, + "intent": "Modify the address of order #65 to 789 Pine Lane, San Francisco, CA, 94102", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/65", + "locator": "", + "required_contents": { + "must_include": [ + "789 Pine Lane", + "San Francisco", + "California", + "94102" + ] + } + } + ] + }, + "intent_template_id": 240 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 540, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Modify the address of order #{{order_id}} to {{address}}", + "instantiation_dict": { + "order_id": "301", + "address": "321 Birch Boulevard, Suite 200, Dallas, TX, 75201" + }, + "intent": "Modify the address of order #301 to 321 Birch Boulevard, Suite 200, Dallas, TX, 75201", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/301", + "locator": "", + "required_contents": { + "must_include": [ + "321 Birch Boulevard", + "Suite 200", + "Dallas", + "Texas", + "75201" + ] + } + } + ] + }, + "intent_template_id": 240 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 541, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Modify the address of order #{{order_id}} to {{address}}", + "instantiation_dict": { + "order_id": "125", + "address": "654 Elm Drive, Apartment 12, Miami, FL, 33101" + }, + "intent": "Modify the address of order #125 to 654 Elm Drive, Apartment 12, Miami, FL, 33101", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/125", + "locator": "", + "required_contents": { + "must_include": [ + "654 Elm Drive", + "Apartment 12", + "Miami", + "Florida", + "33101" + ] + } + } + ] + }, + "intent_template_id": 240 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 542, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Modify the address of order #{{order_id}} to {{address}}", + "instantiation_dict": { + "order_id": "300", + "address": "987 Cedar Court, Los Angeles, CA, 90012" + }, + "intent": "Modify the address of order #300 to 987 Cedar Court, Los Angeles, CA, 90012", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/sales/order/view/order_id/300", + "locator": "", + "required_contents": { + "must_include": [ + "987 Cedar Court", + "Los Angeles", + "California", + "90012" + ] + } + } + ] + }, + "intent_template_id": 240 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 543, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update the product description of {{product}} to highlight the real user positive reviews by quoting the comments", + "instantiation_dict": { + "product": "Bella Tank" + }, + "intent": "Update the product description of Bella Tank to highlight the real user positive reviews by quoting the comments", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/../bella-tank.html", + "locator": "document.querySelector('.data.item.content').outerText + (document.querySelector('.product.attribute.overview [itemprop=\"description\"]')?.outerText || '')", + "required_contents": { + "must_include": [ + "Good choice for working out and stylin' enough to wear when I'm hanging with friends on hot days", + "Also washes really well", + "Always a sweet n sporty look for the gym", + "Keeps me cool and the seams don't rub up against me like some of my other tanks" + ] + } + } + ] + }, + "intent_template_id": 251 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 544, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update the description of {{product}} to highlight the real user positive reviews by quoting the comments", + "instantiation_dict": { + "product": "Selena Yoga Hoodie" + }, + "intent": "Update the description of Selena Yoga Hoodie to highlight the real user positive reviews by quoting the comments", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/../selene-yoga-hoodie.html", + "locator": "document.querySelector('.data.item.content').outerText + (document.querySelector('.product.attribute.overview [itemprop=\"description\"]')?.outerText || '')", + "required_contents": { + "must_include": [ + "I was super cold and it did the job.", + "The sleeves are definitely thicker than you realize, which is a good thing", + "really quite substantial", + "planning on buying another one of these in another color", + "the best hoodie ive ever owned" + ] + } + } + ] + }, + "intent_template_id": 251 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 545, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update the description of {{product}} to highlight the real user positive reviews by quoting the comments", + "instantiation_dict": { + "product": "Radiant Tee" + }, + "intent": "Update the description of Radiant Tee to highlight the real user positive reviews by quoting the comments", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/../radiant-tee.html", + "locator": "document.querySelector('.data.item.content').outerText + (document.querySelector('.product.attribute.overview [itemprop=\"description\"]')?.outerText || '')", + "required_contents": { + "must_include": [ + "What I rally love here is that it does the job of keeping me cool and dry", + "I'm a big guy and sweat A LOT", + "Even after a day of gulf, I'm still dry and comfortable", + "What a versatile shirt", + "Not only does it feel very soft compared to my old worn out polos, but it also does the job promised", + "I like going out after my game for drinks so I look good then too and don't need to change into something fresh" + ] + } + } + ] + }, + "intent_template_id": 251 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 546, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Update the description of {{product}} to highlight the real user positive reviews by quoting the comments", + "instantiation_dict": { + "product": "Lucia Cross-Fit Bra" + }, + "intent": "Update the description of Lucia Cross-Fit Bra to highlight the real user positive reviews by quoting the comments", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/../affirm-water-bottle.html", + "locator": "document.querySelector('.data.item.content').outerText + (document.querySelector('.product.attribute.overview [itemprop=\"description\"]')?.outerText || '')", + "required_contents": { + "must_include": [ + "Wide mouth opening makes it easy to clean" + ] + } + } + ] + }, + "intent_template_id": 251 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 547, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a new {{option}} option {{value}} to the {{base_setting}} of {{product}}", + "instantiation_dict": { + "option": "color", + "value": "brown", + "base_setting": "size S", + "product": "Phoebe Zipper Sweatshirt" + }, + "intent": "Add a new color option brown to the size S of Phoebe Zipper Sweatshirt", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1130/", + "locator": "document.querySelector('[data-index=\"configurable\"').outerText", + "required_contents": { + "must_include": [ + "Phoebe Zipper Sweatshirt-S-Brown" + ] + } + } + ] + }, + "intent_template_id": 252 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 548, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a new {{option}} {{value}} to {{base_setting}} of {{product}}", + "instantiation_dict": { + "option": "color", + "value": "blue", + "base_setting": "size S and M", + "product": "Frankie Sweatshirt" + }, + "intent": "Add a new color blue to size S and M of Frankie Sweatshirt", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/110/", + "locator": "document.querySelector('[data-index=\"configurable\"').outerText", + "required_contents": { + "must_include": [ + "Sweatshirt-M-Blue", + "Sweatshirt-S-Blue" + ] + } + } + ] + }, + "intent_template_id": 252 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 549, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a new {{option}} {{value}} to {{base_setting}} {{product}}", + "instantiation_dict": { + "option": "size", + "value": "XXXL", + "base_setting": "green", + "product": "Minerva LumaTech V-Tee" + }, + "intent": "Add a new size XXXL to green Minerva LumaTech V-Tee", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1492/", + "locator": "document.querySelector('[data-index=\"configurable\"').outerText", + "required_contents": { + "must_include": [ + "V-Tee-XXXL-Green" + ] + } + } + ] + }, + "intent_template_id": 252 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 550, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a new {{option}} {{value}} to {{base_setting}} {{product}}", + "instantiation_dict": { + "option": "size", + "value": "XXS", + "base_setting": "blue and purple", + "product": "Nona Fitness Tank" + }, + "intent": "Add a new size XXS to blue and purple Nona Fitness Tank", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1732/", + "locator": "document.querySelector('[data-index=\"configurable\"').outerText", + "required_contents": { + "must_include": [ + "Tank-XXS-Blue", + "Tank-XXS-Purple" + ] + } + } + ] + }, + "intent_template_id": 252 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 551, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add new {{option}} {{value}} to {{base_setting}} of {{product}}", + "instantiation_dict": { + "option": "size", + "value": "30 and 31", + "base_setting": "all color variants", + "product": "Diana Tights" + }, + "intent": "Add new size 30 and 31 to all color variants of Diana Tights", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1854/", + "locator": "document.querySelector('[data-index=\"configurable\"').outerText", + "required_contents": { + "must_include": [ + "Tights-30-Blue", + "Tights-30-Black", + "Tights-30-Orange", + "Tights-31-Blue", + "Tights-31-Black", + "Tights-31-Orange" + ] + } + } + ] + }, + "intent_template_id": 252 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 552, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a folder named {{directory}} in {{gitlab_repo}} repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the {{subreddit}}?", + "instantiation_dict": { + "directory": "real_space", + "subreddit": "space", + "gitlab_repo": "gimmiethat.space" + }, + "intent": "Create a folder named real_space in gimmiethat.space repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the space?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/real_space/urls.txt", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/space/134164/scientists-erupt-at-nasa-gutting-funding-for-crucial-venus", + "__REDDIT__/f/space/134163/virgin-orbit-fails-to-secure-funding-will-cease-operations", + "__REDDIT__/f/space/134162/nasa-to-name-artemis-2-crew-next-week-the-first-moon", + "__REDDIT__/f/space/134161/bent-light-in-deep-space-reveals-one-of-the-biggest-black", + "__REDDIT__/f/space/134160/seti-s-new-machine-learning-algorithm-works-like-google-s" + ] + } + } + ] + }, + "intent_template_id": 84 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 553, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a folder named {{directory}} in {{gitlab_repo}} repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the {{subreddit}}?", + "instantiation_dict": { + "directory": "news", + "gitlab_repo": "gimmiethat.space", + "subreddit": "news related subreddits" + }, + "intent": "Create a folder named news in gimmiethat.space repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the news related subreddits?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/news/urls.txt", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/news/129905/ohio-man-charged-for-using-molotov-cocktails-to-attack", + "__REDDIT__/f/news/129904/in-a-loss-for-fox-news-judge-allows-dominion-s-defamation", + "__REDDIT__/f/news/129903/theater-group-sues-to-block-tennessee-s-new-anti-drag-law", + "__REDDIT__/f/news/129902/andrew-tate-released-from-jail-in-romania-and-placed-under", + "__REDDIT__/f/news/129901/rare-high-risk-storm-alert-issued-for-parts-of-midwest-and" + ] + } + } + ] + }, + "intent_template_id": 84 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 554, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a folder named {{directory}} in {{gitlab_repo}} repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the {{subreddit}}?", + "instantiation_dict": { + "directory": "moive_space", + "gitlab_repo": "gimmiethat.space", + "subreddit": "movies" + }, + "intent": "Create a folder named moive_space in gimmiethat.space repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the movies?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/moive_space/urls.txt", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/movies/128825/scenes-in-film-that-feel-off-or-wrong-in-some-way-and-make", + "__REDDIT__/f/movies/128824/disney-s-live-action-lilo-amp-stitch-movie-finds-its-lilo-in", + "__REDDIT__/f/movies/128823/fantastic-four-movie-gets-new-writer-with-avatar-the-way-of", + "__REDDIT__/f/movies/128822/can-someone-explain-what-made-steven-seagal-so-appealing-for", + "__REDDIT__/f/movies/128821/ban-on-fetish-sex-depictions-in-film-should-end-australia" + ] + } + } + ] + }, + "intent_template_id": 84 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 555, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a folder named {{directory}} in {{gitlab_repo}} repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the {{subreddit}}?", + "instantiation_dict": { + "directory": "funny_pic", + "gitlab_repo": "gimmiethat.space", + "subreddit": "memes" + }, + "intent": "Create a folder named funny_pic in gimmiethat.space repo. Within it, create a file named urls.txt that contains the URLs of the 5 most recent posts from the memes?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/raw/main/funny_pic/urls.txt", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/memes/127991/it-do-be-like-that-tho", + "__REDDIT__/f/memes/127990/thank-you-memers-this-wouldn-t-be-possible-without-you", + "__REDDIT__/f/memes/127989/if-you-have-no-other-choice", + "__REDDIT__/f/memes/127988/yes-yes-yes", + "__REDDIT__/f/memes/127987/shagadelic-baby" + ] + } + } + ] + }, + "intent_template_id": 84 + }, + { + "sites": [ + "gitlab", + "wikipedia" + ], + "task_id": 556, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a repo named {{name}} with {{topics}} in a README file", + "instantiation_dict": { + "name": "nolan_honest_fans", + "topics": "movies directed by Christopher Nolan" + }, + "intent": "Create a repo named nolan_honest_fans with movies directed by Christopher Nolan in a README file", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/nolan_honest_fans/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "Following", + "Memento", + "Insomnia", + "Batman Begins", + "The Prestige", + "The Dark Knight", + "Inception", + "The Dark Knight Rises", + "Interstellar", + "Dunkirk", + "Tenet", + "Oppenheimer" + ] + } + } + ] + }, + "intent_template_id": 87 + }, + { + "sites": [ + "gitlab", + "wikipedia" + ], + "task_id": 557, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a repo named {{name}} with {{topics}} in a README file", + "instantiation_dict": { + "name": "nolan_old_fans", + "topics": "movies directed by Christopher Nolan before 2010" + }, + "intent": "Create a repo named nolan_old_fans with movies directed by Christopher Nolan before 2010 in a README file", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/nolan_old_fans/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "Following", + "Memento", + "Insomnia", + "Batman Begins", + "The Prestige", + "The Dark Knight" + ] + } + } + ] + }, + "intent_template_id": 87 + }, + { + "sites": [ + "gitlab", + "wikipedia" + ], + "task_id": 558, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a repo named {{name}} with {{topics}} in a README file", + "instantiation_dict": { + "name": "nolan_young_fans", + "topics": "movies directed by Christopher Nolan after 2010" + }, + "intent": "Create a repo named nolan_young_fans with movies directed by Christopher Nolan after 2010 in a README file", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/nolan_young_fans/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "Inception", + "The Dark Knight Rises", + "Interstellar", + "Dunkirk", + "Tenet", + "Oppenheimer" + ] + } + } + ] + }, + "intent_template_id": 87 + }, + { + "sites": [ + "gitlab", + "wikipedia" + ], + "task_id": 559, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a repo named {{name}} with {{topics}} in a README file", + "instantiation_dict": { + "name": "nolan_followers", + "topics": "career timeline of Christopher Nolan" + }, + "intent": "Create a repo named nolan_followers with career timeline of Christopher Nolan in a README file", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/nolan_followers/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "1993\u20132003: Early career and breakthrough", + "2003\u20132013: Widespread recognition", + "2014\u20132019: Established Hollywood auteur", + "2020\u2013present" + ] + } + } + ] + }, + "intent_template_id": 87 + }, + { + "sites": [ + "gitlab", + "wikipedia" + ], + "task_id": 560, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a repo named {{name}} with {{topics}} in a README file", + "instantiation_dict": { + "name": "nolan_academy_awards", + "topics": "movies that won Academy Awards by Christopher Nolan" + }, + "intent": "Create a repo named nolan_academy_awards with movies that won Academy Awards by Christopher Nolan in a README file", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/nolan_academy_awards/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "The Dark Knight", + "Inception", + "Interstellar", + "Dunkirk", + "Tenet" + ] + } + } + ] + }, + "intent_template_id": 87 + }, + { + "sites": [ + "gitlab", + "wikipedia" + ], + "task_id": 561, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a repo named {{name}} with {{topics}} in a README file", + "instantiation_dict": { + "name": "bafta_awards_nolan", + "topics": "movies that are nominated BAFTA Awards by Christopher Nolan" + }, + "intent": "Create a repo named bafta_awards_nolan with movies that are nominated BAFTA Awards by Christopher Nolan in a README file", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/bafta_awards_nolan/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "Batman Begins", + "The Dark Knight", + "Inception", + "The Dark Knight Rises", + "Interstellar", + "Dunkirk", + "Tenet" + ] + } + } + ] + }, + "intent_template_id": 87 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 562, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a repository named {{name}} that includes a README file with the links to the most active {{num}} DIY ideas on DIY subreddit?", + "instantiation_dict": { + "name": "Awesome_DIY_ideas", + "num": 6 + }, + "intent": "create a repository named Awesome_DIY_ideas that includes a README file with the links to the most active 6 DIY ideas on DIY subreddit?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/Awesome_DIY_ideas/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/DIY/118903/separate-glued-plastic-parts", + "__REDDIT__/f/DIY/118923/how-would-you-fix-this-dryer-vent-mess", + "__REDDIT__/f/DIY/118935/basement-bulkhead-soffit-wall-framing", + "__REDDIT__/f/DIY/118904/ge-water-heater-pilot-light-won-t-stay-lit", + "__REDDIT__/f/DIY/118960/attempting-to-move-a-wall-outlet-in-my-basement-a-few-inches", + "__REDDIT__/f/DIY/118931/afci-outlet-question" + ] + } + } + ] + }, + "intent_template_id": 88 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 563, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a repository named {{name}} that includes a README file with the links to the most active {{num}} DIY ideas on DIY subreddit?", + "instantiation_dict": { + "name": "fun_thing_to_do", + "num": 5 + }, + "intent": "create a repository named fun_thing_to_do that includes a README file with the links to the most active 5 DIY ideas on DIY subreddit?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/fun_thing_to_do/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/DIY/118903/separate-glued-plastic-parts", + "__REDDIT__/f/DIY/118923/how-would-you-fix-this-dryer-vent-mess", + "__REDDIT__/f/DIY/118935/basement-bulkhead-soffit-wall-framing", + "__REDDIT__/f/DIY/118904/ge-water-heater-pilot-light-won-t-stay-lit", + "__REDDIT__/f/DIY/118960/attempting-to-move-a-wall-outlet-in-my-basement-a-few-inches" + ] + } + } + ] + }, + "intent_template_id": 88 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 564, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a repository named {{name}} that includes a README file with the links to the most active {{num}} DIY ideas on DIY subreddit?", + "instantiation_dict": { + "name": "live_a_life", + "num": 3 + }, + "intent": "create a repository named live_a_life that includes a README file with the links to the most active 3 DIY ideas on DIY subreddit?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/live_a_life/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/DIY/118903/separate-glued-plastic-parts", + "__REDDIT__/f/DIY/118923/how-would-you-fix-this-dryer-vent-mess", + "__REDDIT__/f/DIY/118935/basement-bulkhead-soffit-wall-framing" + ] + } + } + ] + }, + "intent_template_id": 88 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 565, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a repository named {{name}} that includes a README file with the links to the most active {{num}} DIY ideas on DIY subreddit?", + "instantiation_dict": { + "name": "TODO", + "num": 10 + }, + "intent": "create a repository named TODO that includes a README file with the links to the most active 10 DIY ideas on DIY subreddit?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/TODO/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/DIY/118903/separate-glued-plastic-parts", + "__REDDIT__/f/DIY/118923/how-would-you-fix-this-dryer-vent-mess", + "__REDDIT__/f/DIY/118935/basement-bulkhead-soffit-wall-framing", + "__REDDIT__/f/DIY/118904/ge-water-heater-pilot-light-won-t-stay-lit", + "__REDDIT__/f/DIY/118960/attempting-to-move-a-wall-outlet-in-my-basement-a-few-inches", + "__REDDIT__/f/DIY/118931/afci-outlet-question", + "__REDDIT__/f/DIY/118824/teflon-tape-to-attach-washing-machine-drain-hose-to-pipe", + "__REDDIT__/f/DIY/118866/paver-base-for-shed", + "__REDDIT__/f/DIY/118820/ways-to-locate-our-buried-electrical-service", + "__REDDIT__/f/DIY/118836/how-to-eliminate-transitions-for-disability-mobility-reasons" + ] + } + } + ] + }, + "intent_template_id": 88 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 566, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a repository named {{name}} that includes a README file with the links to the most active {{num}} DIY ideas on DIY subreddit?", + "instantiation_dict": { + "name": "Do it myself", + "num": 8 + }, + "intent": "create a repository named Do it myself that includes a README file with the links to the most active 8 DIY ideas on DIY subreddit?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/Do-it-myself/-/raw/main/README.md", + "locator": "", + "required_contents": { + "must_include": [ + "__REDDIT__/f/DIY/118903/separate-glued-plastic-parts", + "__REDDIT__/f/DIY/118923/how-would-you-fix-this-dryer-vent-mess", + "__REDDIT__/f/DIY/118935/basement-bulkhead-soffit-wall-framing", + "__REDDIT__/f/DIY/118904/ge-water-heater-pilot-light-won-t-stay-lit", + "__REDDIT__/f/DIY/118960/attempting-to-move-a-wall-outlet-in-my-basement-a-few-inches", + "__REDDIT__/f/DIY/118931/afci-outlet-question", + "__REDDIT__/f/DIY/118824/teflon-tape-to-attach-washing-machine-drain-hose-to-pipe", + "__REDDIT__/f/DIY/118866/paver-base-for-shed" + ] + } + } + ] + }, + "intent_template_id": 88 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 567, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Invite {{collaborator_account_list}} as collaborator to {{repo}} repo", + "instantiation_dict": { + "collaborator_account_list": "Jakub Klinkovsk\u00fd and Beno\u00eet Blanchon", + "repo": "gimmiethat.space" + }, + "intent": "Invite Jakub Klinkovsk\u00fd and Beno\u00eet Blanchon as collaborator to gimmiethat.space repo", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@lahwaacz", + "@bblanchon" + ] + } + } + ] + }, + "intent_template_id": 293 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 568, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Invite {{collaborator_account_list}} as collaborator to {{repo}} repo", + "instantiation_dict": { + "collaborator_account_list": "Abishek and Vinta", + "repo": "a11yproject.com" + }, + "intent": "Invite Abishek and Vinta as collaborator to a11yproject.com repo", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/a11yproject/a11yproject.com/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@abisubramanya27", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 293 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 569, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Invite {{collaborator_account_list}} as collaborator to {{repo}} repo", + "instantiation_dict": { + "collaborator_account_list": "Beno\u00eet and Abishek", + "repo": "my HTML5 markup extention" + }, + "intent": "Invite Beno\u00eet and Abishek as collaborator to my HTML5 markup extention repo", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/accessible-html-content-patterns/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@bblanchon", + "@abisubramanya27" + ] + } + } + ] + }, + "intent_template_id": 293 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 570, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Invite {{collaborator_account_list}} as collaborator to {{repo}} repo", + "instantiation_dict": { + "collaborator_account_list": "Jakub K, Alex Dills, Alex Hutnik and Beno\u00eet Blanchon", + "repo": "my time tracking tool project" + }, + "intent": "Invite Jakub K, Alex Dills, Alex Hutnik and Beno\u00eet Blanchon as collaborator to my time tracking tool project repo", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/timeit/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@lahwaacz", + "@V13Axel", + "@alexhutnik", + "@bblanchon" + ] + } + } + ] + }, + "intent_template_id": 293 + }, + { + "sites": [ + "shopping" + ], + "task_id": 571, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I recently moved, my address is {{address}}, update my information on OneStopShopping accordingly", + "instantiation_dict": { + "address": "231 Willow Way, Suite 100, Chicago, IL, 60601" + }, + "intent": "I recently moved, my address is 231 Willow Way, Suite 100, Chicago, IL, 60601, update my information on OneStopShopping accordingly", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-billing > .box-content\").outerText", + "required_contents": { + "must_include": [ + "231 Willow Way", + "Suite 100", + "Chicago, Illinois, 60601" + ] + } + }, + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-shipping > .box-content\").outerText", + "required_contents": { + "must_include": [ + "231 Willow Way", + "Suite 100", + "Chicago, Illinois, 60601" + ] + } + } + ] + }, + "intent_template_id": 165 + }, + { + "sites": [ + "shopping" + ], + "task_id": 572, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I recently moved, my address is {{address}}, update my information on OneStopShopping accordingly", + "instantiation_dict": { + "address": "654 Aspen Road, House #3, Boston, MA, 02110" + }, + "intent": "I recently moved, my address is 654 Aspen Road, House #3, Boston, MA, 02110, update my information on OneStopShopping accordingly", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-billing > .box-content\").outerText", + "required_contents": { + "must_include": [ + "654 Aspen Road", + "House #3", + "Boston, Massachusetts, 02110" + ] + } + }, + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-shipping > .box-content\").outerText", + "required_contents": { + "must_include": [ + "654 Aspen Road", + "House #3", + "Boston, Massachusetts, 02110" + ] + } + } + ] + }, + "intent_template_id": 165 + }, + { + "sites": [ + "shopping" + ], + "task_id": 573, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I recently moved, my address is {{address}}, update my information on OneStopShopping accordingly", + "instantiation_dict": { + "address": "987 Sycamore Circle, Philadelphia, PA, 19102" + }, + "intent": "I recently moved, my address is 987 Sycamore Circle, Philadelphia, PA, 19102, update my information on OneStopShopping accordingly", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-shipping > .box-content\").outerText", + "required_contents": { + "must_include": [ + "987 Sycamore Circle", + "Philadelphia, Pennsylvania, 19102" + ] + } + }, + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-billing > .box-content\").outerText", + "required_contents": { + "must_include": [ + "987 Sycamore Circle", + "Philadelphia, Pennsylvania, 19102" + ] + } + } + ] + }, + "intent_template_id": 165 + }, + { + "sites": [ + "shopping" + ], + "task_id": 574, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I recently moved, my address is {{address}}, update my information on OneStopShopping accordingly", + "instantiation_dict": { + "address": "111 Magnolia Path, Atlanta, GA, 30303" + }, + "intent": "I recently moved, my address is 111 Magnolia Path, Atlanta, GA, 30303, update my information on OneStopShopping accordingly", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-shipping > .box-content\").outerText", + "required_contents": { + "must_include": [ + "111 Magnolia Path", + "Atlanta, Georgia, 30303" + ] + } + }, + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-billing > .box-content\").outerText", + "required_contents": { + "must_include": [ + "111 Magnolia Path", + "Atlanta, Georgia, 30303" + ] + } + } + ] + }, + "intent_template_id": 165 + }, + { + "sites": [ + "shopping" + ], + "task_id": 575, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "I recently moved, my address is {{address}}, update my information on OneStopShopping accordingly", + "instantiation_dict": { + "address": "222 Redwood Rise, Suite 300, Seattle, WA, 98101" + }, + "intent": "I recently moved, my address is 222 Redwood Rise, Suite 300, Seattle, WA, 98101, update my information on OneStopShopping accordingly", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-shipping > .box-content\").outerText", + "required_contents": { + "must_include": [ + "222 Redwood Rise", + "Suite 300", + "Seattle, Washington, 98101" + ] + } + }, + { + "url": "__SHOPPING__/customer/address", + "locator": "document.querySelector(\".box.box-address-billing > .box-content\").outerText", + "required_contents": { + "must_include": [ + "222 Redwood Rise", + "Suite 300", + "Seattle, Washington, 98101" + ] + } + } + ] + }, + "intent_template_id": 165 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 576, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Add the following users to repo {{repo}} as {{role}}: {{user_list}}", + "instantiation_dict": { + "repo": "a11y-webring.club", + "role": "developer", + "user_list": [ + "abisubramanya27", + "lahwaacz" + ] + }, + "intent": "Add the following users to repo a11y-webring.club as developer: ['abisubramanya27', 'lahwaacz']", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/a11y-webring.club/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'abisubramanya27')", + "required_contents": { + "must_include": [ + "Developer" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/a11y-webring.club/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'lahwaacz')", + "required_contents": { + "must_include": [ + "Developer" + ] + } + } + ] + }, + "intent_template_id": 351 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 577, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Add the following users to my {{repo}} as {{role}}: {{user_list}}", + "instantiation_dict": { + "repo": "GitHub timeline item management extension", + "role": "maintainer", + "user_list": [ + "abisubramanya27", + "lahwaacz" + ] + }, + "intent": "Add the following users to my GitHub timeline item management extension as maintainer: ['abisubramanya27', 'lahwaacz']", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/remove-board-movement-events-from-the-github-issue-timeline/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'abisubramanya27')", + "required_contents": { + "must_include": [ + "Maintainer" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/remove-board-movement-events-from-the-github-issue-timeline/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'lahwaacz')", + "required_contents": { + "must_include": [ + "Maintainer" + ] + } + } + ] + }, + "intent_template_id": 351 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 578, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Add the following users to repo {{repo}} as {{role}}: {{user_list}}", + "instantiation_dict": { + "repo": "millennials-to-snake-people", + "role": "reporter", + "user_list": [ + "yjlou", + "a11yproject" + ] + }, + "intent": "Add the following users to repo millennials-to-snake-people as reporter: ['yjlou', 'a11yproject']", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/millennials-to-snake-people/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'yjlou')", + "required_contents": { + "must_include": [ + "Reporter" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/millennials-to-snake-people/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'a11yproject')", + "required_contents": { + "must_include": [ + "Reporter" + ] + } + } + ] + }, + "intent_template_id": 351 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 579, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Add the following users to my {{repo}} as {{role}}: {{user_list}}", + "instantiation_dict": { + "repo": "time tracking tool", + "role": "guest", + "user_list": [ + "yjlou" + ] + }, + "intent": "Add the following users to my time tracking tool as guest: ['yjlou']", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/timeit/-/project_members", + "locator": "func:gitlab_get_project_memeber_role(__page__, 'yjlou')", + "required_contents": { + "must_include": [ + "Guest" + ] + } + } + ] + }, + "intent_template_id": 351 + }, + { + "sites": [ + "reddit" + ], + "task_id": 580, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a new forum named {{name}}, with a description of {{description}}, and include {{sidebar_list}} in the sidebar?", + "instantiation_dict": { + "name": "sci_fi", + "description": "A wild place for sci-fi enthusiasts", + "sidebar_list": [ + "New", + "Classic", + "Movies", + "Post my novel", + "Random" + ] + }, + "intent": "Create a new forum named sci_fi, with a description of A wild place for sci-fi enthusiasts, and include ['New', 'Classic', 'Movies', 'Post my novel', 'Random'] in the sidebar?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/sci_fi/edit", + "locator": "document.querySelector(\"#forum_description\").value", + "required_contents": { + "must_include": [ + "A wild place for sci-fi enthusiasts" + ] + } + }, + { + "url": "__REDDIT__/f/sci_fi/edit", + "locator": "document.querySelector(\"#forum_sidebar\").value", + "required_contents": { + "must_include": [ + "New", + "Classic", + "Movies", + "Post my novel", + "Random" + ] + } + } + ] + }, + "intent_template_id": 7 + }, + { + "sites": [ + "reddit" + ], + "task_id": 581, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a new forum named {{name}}, with a description of {{description}}, and include {{sidebar_list}} in the sidebar?", + "instantiation_dict": { + "name": "cmu_lti", + "description": "Language Technologies Institute at Carnegie Mellon University", + "sidebar_list": [ + "announcement", + "paper", + "alumni" + ] + }, + "intent": "Create a new forum named cmu_lti, with a description of Language Technologies Institute at Carnegie Mellon University, and include ['announcement', 'paper', 'alumni'] in the sidebar?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/cmu_lti/edit", + "locator": "document.querySelector(\"#forum_description\").value", + "required_contents": { + "must_include": [ + "Language Technologies Institute at Carnegie Mellon University" + ] + } + }, + { + "url": "__REDDIT__/f/cmu_lti/edit", + "locator": "document.querySelector(\"#forum_sidebar\").value", + "required_contents": { + "must_include": [ + "announcement", + "paper", + "alumni" + ] + } + } + ] + }, + "intent_template_id": 7 + }, + { + "sites": [ + "reddit" + ], + "task_id": 582, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a new forum named {{name}}, with a description of {{description}}, and include {{sidebar_list}} in the sidebar?", + "instantiation_dict": { + "name": "Cyberpunk", + "description": "Welcome to the future", + "sidebar_list": [ + "Games", + "Books", + "Movies", + "Future" + ] + }, + "intent": "Create a new forum named Cyberpunk, with a description of Welcome to the future, and include ['Games', 'Books', 'Movies', 'Future'] in the sidebar?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/Cyberpunk/edit", + "locator": "document.querySelector(\"#forum_description\").value", + "required_contents": { + "must_include": [ + "Welcome to the future" + ] + } + }, + { + "url": "__REDDIT__/f/Cyberpunk/edit", + "locator": "document.querySelector(\"#forum_sidebar\").value", + "required_contents": { + "must_include": [ + "Games", + "Books", + "Movies", + "Future" + ] + } + } + ] + }, + "intent_template_id": 7 + }, + { + "sites": [ + "reddit" + ], + "task_id": 583, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a new forum named {{name}}, with a description of {{description}}, and include {{sidebar_list}} in the sidebar?", + "instantiation_dict": { + "name": "PlantsForCatParents", + "description": "Cat parents & plant lovers", + "sidebar_list": [ + "Cat friendly", + "Local vendors", + "Promotion", + "Toxic plants!" + ] + }, + "intent": "Create a new forum named PlantsForCatParents, with a description of Cat parents & plant lovers, and include ['Cat friendly', 'Local vendors', 'Promotion', 'Toxic plants!'] in the sidebar?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/PlantsForCatParents/edit", + "locator": "document.querySelector(\"#forum_description\").value", + "required_contents": { + "must_include": [ + "Cat parents & plant lovers" + ] + } + }, + { + "url": "__REDDIT__/f/PlantsForCatParents/edit", + "locator": "document.querySelector(\"#forum_sidebar\").value", + "required_contents": { + "must_include": [ + "Cat friendly", + "Local vendors", + "Promotion", + "Toxic plants!" + ] + } + } + ] + }, + "intent_template_id": 7 + }, + { + "sites": [ + "reddit" + ], + "task_id": 584, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a new forum named {{name}}, with a description of {{description}}, and include {{sidebar_list}} in the sidebar?", + "instantiation_dict": { + "name": "Karaoke", + "description": "Place for Karaoke lovers", + "sidebar_list": [ + "devices", + "setup" + ] + }, + "intent": "Create a new forum named Karaoke, with a description of Place for Karaoke lovers, and include ['devices', 'setup'] in the sidebar?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/Karaoke/edit", + "locator": "document.querySelector(\"#forum_description\").value", + "required_contents": { + "must_include": [ + "Place for Karaoke lovers" + ] + } + }, + { + "url": "__REDDIT__/f/Karaoke/edit", + "locator": "document.querySelector(\"#forum_sidebar\").value", + "required_contents": { + "must_include": [ + "devices", + "setup" + ] + } + } + ] + }, + "intent_template_id": 7 + }, + { + "sites": [ + "shopping" + ], + "task_id": 585, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Rate my recent purchase of {{product}} with {{num_star}} stars, using my nickname {{nickname}}?", + "instantiation_dict": { + "product": "floor lamp", + "num_star": 5, + "nickname": "Emma Lopez" + }, + "intent": "Rate my recent purchase of floor lamp with 5 stars, using my nickname Emma Lopez?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_rating('B00J8RZL7I')", + "required_contents": { + "must_include": [ + "100" + ] + } + }, + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_author('B00J8RZL7I')", + "required_contents": { + "must_include": [ + "Emma Lopez" + ] + } + } + ] + }, + "intent_template_id": 194 + }, + { + "sites": [ + "shopping" + ], + "task_id": 586, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Rate my recent purchase of {{product}} with {{num_star}} stars, using my nickname {{nickname}}?", + "instantiation_dict": { + "product": "Jiffy Corn Muffin Cornbread Mix", + "num_star": 4, + "nickname": "ShoppingEmma" + }, + "intent": "Rate my recent purchase of Jiffy Corn Muffin Cornbread Mix with 4 stars, using my nickname ShoppingEmma?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_rating('B07HZB38XH')", + "required_contents": { + "must_include": [ + "80" + ] + } + }, + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_author('B07HZB38XH')", + "required_contents": { + "must_include": [ + "ShoppingEmma" + ] + } + } + ] + }, + "intent_template_id": 194 + }, + { + "sites": [ + "shopping" + ], + "task_id": 587, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Rate my recent purchase of {{product}} with {{num_star}} stars, using my nickname {{nickname}}?", + "instantiation_dict": { + "product": "PS3 Remote Controllers", + "num_star": 3, + "nickname": "GamingEmma" + }, + "intent": "Rate my recent purchase of PS3 Remote Controllers with 3 stars, using my nickname GamingEmma?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_rating('B0041MSF2S')", + "required_contents": { + "must_include": [ + "60" + ] + } + }, + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_author('B0041MSF2S')", + "required_contents": { + "must_include": [ + "GamingEmma" + ] + } + } + ] + }, + "intent_template_id": 194 + }, + { + "sites": [ + "shopping" + ], + "task_id": 588, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Rate my recent purchase of {{product}} with {{num_star}} stars, using my nickname {{nickname}}?", + "instantiation_dict": { + "product": "Foundation For Mattress With Frame Set", + "num_star": 1, + "nickname": "ShoppingEmma" + }, + "intent": "Rate my recent purchase of Foundation For Mattress With Frame Set with 1 stars, using my nickname ShoppingEmma?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_rating('B07DFJ5XKH')", + "required_contents": { + "must_include": [ + "20" + ] + } + }, + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_author('B07DFJ5XKH')", + "required_contents": { + "must_include": [ + "ShoppingEmma" + ] + } + } + ] + }, + "intent_template_id": 194 + }, + { + "sites": [ + "shopping" + ], + "task_id": 589, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Rate my recent purchase of {{product}} with {{num_star}} stars, using my nickname {{nickname}}?", + "instantiation_dict": { + "product": "Mini Wireless Bluetooth Speaker", + "num_star": 2, + "nickname": "SimpleEmma" + }, + "intent": "Rate my recent purchase of Mini Wireless Bluetooth Speaker with 2 stars, using my nickname SimpleEmma?", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_rating('B09P7BFL4H')", + "required_contents": { + "must_include": [ + "40" + ] + } + }, + { + "url": "last", + "locator": "func:shopping_get_sku_latest_review_author('B09P7BFL4H')", + "required_contents": { + "must_include": [ + "SimpleEmma" + ] + } + } + ] + }, + "intent_template_id": 194 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 590, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Create a milestone for the upcoming {{event}} starting on {{start_date}} and ending on {{end_date}}", + "instantiation_dict": { + "event": "event of product launch", + "start_date": "1/16/2023", + "end_date": "1/30/2023" + }, + "intent": "Create a milestone for the upcoming event of product launch starting on 1/16/2023 and ending on 1/30/2023", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/milestones", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"#content-body\").outerText", + "required_contents": { + "must_include": [ + "product launch" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.start_date').outerText", + "required_contents": { + "must_include": [ + "Jan 16, 2030" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.due_date').outerText", + "required_contents": { + "must_include": [ + "Jan 30, 2030" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 339 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 591, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Create a milestone for the upcoming {{event}} starting on {{start_date}} and ending on {{end_date}}", + "instantiation_dict": { + "event": "practice of collective code review", + "start_date": "1/16/2023", + "end_date": "in 20 days" + }, + "intent": "Create a milestone for the upcoming practice of collective code review starting on 1/16/2023 and ending on in 20 days", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/milestones", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"#content-body\").outerText", + "required_contents": { + "must_include": [ + "code review" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.start_date').outerText", + "required_contents": { + "must_include": [ + "Jan 16, 2030" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.due_date').outerText", + "required_contents": { + "must_include": [ + "Feb 5, 2030" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 339 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 592, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Create a milestone for the upcoming {{event}} starting on {{start_date}} and ending on {{end_date}}", + "instantiation_dict": { + "event": "task of cleaning sensitive information", + "start_date": "2/16/2023", + "end_date": "in 20 days" + }, + "intent": "Create a milestone for the upcoming task of cleaning sensitive information starting on 2/16/2023 and ending on in 20 days", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/milestones", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"#content-body\").outerText", + "required_contents": { + "must_include": [ + "sensitive information" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.start_date').outerText", + "required_contents": { + "must_include": [ + "Feb 16, 2030" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.due_date').outerText", + "required_contents": { + "must_include": [ + "Mar 8, 2030" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 339 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 593, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/dotfiles", + "geolocation": null, + "intent_template": "Create a milestone for the upcoming {{event}} starting on {{start_date}} and ending on {{end_date}}", + "instantiation_dict": { + "event": "task of merging all branches to main", + "start_date": "March 15, 2044", + "end_date": "March 30, 2044" + }, + "intent": "Create a milestone for the upcoming task of merging all branches to main starting on March 15, 2044 and ending on March 30, 2044", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/dotfiles/-/milestones", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"#content-body\").outerText", + "required_contents": { + "must_include": [ + "all branches to main" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.start_date').outerText", + "required_contents": { + "must_include": [ + "Mar 15, 2044" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.due_date').outerText", + "required_contents": { + "must_include": [ + "Mar 30, 2044" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 339 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 594, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/dotfiles", + "geolocation": null, + "intent_template": "Create a milestone for the upcoming {{event}} starting on {{start_date}} and ending on {{end_date}}", + "instantiation_dict": { + "event": "task of adding a new branch for zsh comprehensive support", + "start_date": "5/1/2044", + "end_date": "in 20 days" + }, + "intent": "Create a milestone for the upcoming task of adding a new branch for zsh comprehensive support starting on 5/1/2044 and ending on in 20 days", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/dotfiles/-/milestones", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"#content-body\").outerText", + "required_contents": { + "must_include": [ + "zsh comprehensive support" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.start_date').outerText", + "required_contents": { + "must_include": [ + "May 1, 2044" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.due_date').outerText", + "required_contents": { + "must_include": [ + "May 21, 2044" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 339 + }, + { + "sites": [ + "reddit" + ], + "task_id": 595, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Open the thread of a trending post on the forum \"{{subreddit}}\" and subscribe.", + "instantiation_dict": { + "subreddit": "space" + }, + "intent": "Open the thread of a trending post on the forum \"space\" and subscribe.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/space", + "program_html": [ + { + "url": "__REDDIT__/", + "locator": "document.querySelector(\"#sidebar > section\").outerText", + "required_contents": { + "must_include": [ + "space" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 4 + }, + { + "sites": [ + "reddit" + ], + "task_id": 596, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Open the thread of a trending post on the forum \"{{subreddit}}\" and subscribe.", + "instantiation_dict": { + "subreddit": "books" + }, + "intent": "Open the thread of a trending post on the forum \"books\" and subscribe.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "__REDDIT__/", + "locator": "document.querySelector(\"#sidebar > section\").outerText", + "required_contents": { + "must_include": [ + "books" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 4 + }, + { + "sites": [ + "reddit" + ], + "task_id": 597, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Open the thread of a trending post on the forum \"{{subreddit}}\" and subscribe.", + "instantiation_dict": { + "subreddit": "consoles" + }, + "intent": "Open the thread of a trending post on the forum \"consoles\" and subscribe.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/consoles", + "program_html": [ + { + "url": "__REDDIT__/", + "locator": "document.querySelector(\"#sidebar > section\").outerText", + "required_contents": { + "must_include": [ + "consoles" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 4 + }, + { + "sites": [ + "reddit" + ], + "task_id": 598, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Open the thread of a trending post on the forum \"{{subreddit}}\" and subscribe.", + "instantiation_dict": { + "subreddit": "pittsburgh" + }, + "intent": "Open the thread of a trending post on the forum \"pittsburgh\" and subscribe.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/pittsburgh", + "program_html": [ + { + "url": "__REDDIT__/", + "locator": "document.querySelector(\"#sidebar > section\").outerText", + "required_contents": { + "must_include": [ + "pittsburgh" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 4 + }, + { + "sites": [ + "reddit" + ], + "task_id": 599, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Open the thread of a trending post on the forum \"{{subreddit}}\" and subscribe.", + "instantiation_dict": { + "subreddit": "machine learning" + }, + "intent": "Open the thread of a trending post on the forum \"machine learning\" and subscribe.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/MachineLearning", + "program_html": [ + { + "url": "__REDDIT__/", + "locator": "document.querySelector(\"#sidebar > section\").outerText", + "required_contents": { + "must_include": [ + "MachineLearning" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 4 + }, + { + "sites": [ + "reddit" + ], + "task_id": 600, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post my question, \"{{question}}\", in a subreddit where I'm likely to get an answer", + "instantiation_dict": { + "question": "what is the recommended console to buy these days" + }, + "intent": "Post my question, \"what is the recommended console to buy these days\", in a subreddit where I'm likely to get an answer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/consoles", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "what is the recommended console to buy these days" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 3765 + }, + { + "sites": [ + "reddit" + ], + "task_id": 601, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post my question, \"{{question}}\", in a subreddit where I'm likely to get an answer", + "instantiation_dict": { + "question": "is car necessary in NYC" + }, + "intent": "Post my question, \"is car necessary in NYC\", in a subreddit where I'm likely to get an answer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/nyc", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "is car necessary in NYC |OR| is a car necessary in NYC" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 3765 + }, + { + "sites": [ + "reddit" + ], + "task_id": 602, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post my question, \"{{question}}\", in a subreddit where I'm likely to get an answer", + "instantiation_dict": { + "question": "places for new drivers to learn driving in pittsburgh" + }, + "intent": "Post my question, \"places for new drivers to learn driving in pittsburgh\", in a subreddit where I'm likely to get an answer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/pittsburgh", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "places for new drivers to learn driving in pittsburgh" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 3765 + }, + { + "sites": [ + "reddit" + ], + "task_id": 603, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post my question, \"{{question}}\", in a subreddit where I'm likely to get an answer", + "instantiation_dict": { + "question": "safe and budget apartment to live in nyc" + }, + "intent": "Post my question, \"safe and budget apartment to live in nyc\", in a subreddit where I'm likely to get an answer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/nyc", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "safe and budget apartment to live in nyc" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 3765 + }, + { + "sites": [ + "reddit" + ], + "task_id": 604, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post my question, \"{{question}}\", in a subreddit where I'm likely to get an answer", + "instantiation_dict": { + "question": "what is the SOTA web navigation agent repo" + }, + "intent": "Post my question, \"what is the SOTA web navigation agent repo\", in a subreddit where I'm likely to get an answer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/deeplearning |OR| __REDDIT__/f/MachineLearning |OR| __REDDIT__/f/singularity", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "what is the SOTA web navigation agent repo" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 3765 + }, + { + "sites": [ + "reddit" + ], + "task_id": 605, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a subreddit focused on topics related to {{topic}}, and post my question, \"{{question}}\" there", + "instantiation_dict": { + "topic": "gaming consoles", + "question": "what is the recommended console to buy these days" + }, + "intent": "Find a subreddit focused on topics related to gaming consoles, and post my question, \"what is the recommended console to buy these days\" there", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/consoles", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "what is the recommended console to buy these days" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 5 + }, + { + "sites": [ + "reddit" + ], + "task_id": 606, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a subreddit focused on topics related to {{topic}}, and post my question, \"{{question}}\" there", + "instantiation_dict": { + "topic": "NYC", + "question": "is car necessary" + }, + "intent": "Find a subreddit focused on topics related to NYC, and post my question, \"is car necessary\" there", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/nyc", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "is car necessary |OR| is a car necessary" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 5 + }, + { + "sites": [ + "reddit" + ], + "task_id": 607, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a subreddit focused on topics related to {{topic}}, and post my question, \"{{question}}\" there", + "instantiation_dict": { + "topic": "city Pittsburgh", + "question": "places for new drivers to learn driving" + }, + "intent": "Find a subreddit focused on topics related to city Pittsburgh, and post my question, \"places for new drivers to learn driving\" there", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/pittsburgh", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "places for new drivers to learn driving" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 5 + }, + { + "sites": [ + "reddit" + ], + "task_id": 608, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a subreddit focused on topics related to {{topic}}, and post my question, \"{{question}}\" there", + "instantiation_dict": { + "topic": "city lives in DMV area", + "question": "safe and budget apartment to live" + }, + "intent": "Find a subreddit focused on topics related to city lives in DMV area, and post my question, \"safe and budget apartment to live\" there", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/washington |OR| __REDDIT__/f/washingtondc", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "safe and budget apartment to live" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 5 + }, + { + "sites": [ + "reddit" + ], + "task_id": 609, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a subreddit focused on topics related to {{topic}}, and post my question, \"{{question}}\" there", + "instantiation_dict": { + "topic": "ML, DL, NLP", + "question": "what is the SOTA web navigation agent repo" + }, + "intent": "Find a subreddit focused on topics related to ML, DL, NLP, and post my question, \"what is the SOTA web navigation agent repo\" there", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/deeplearning |OR| __REDDIT__/f/MachineLearning |OR| __REDDIT__/f/singularity", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "what is the SOTA web navigation agent repo" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 5 + }, + { + "sites": [ + "reddit" + ], + "task_id": 610, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a review of my recent reading \"{{book}}\" in the r/books with my comment \"{{content}}\".", + "instantiation_dict": { + "book": "To Kill a Mockingbird by Harper Lee", + "content": "good book!" + }, + "intent": "Post a review of my recent reading \"To Kill a Mockingbird by Harper Lee\" in the r/books with my comment \"good book!\".", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "To Kill a Mockingbird by Harper Lee", + "good book!" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 9 + }, + { + "sites": [ + "reddit" + ], + "task_id": 611, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a review of my recent reading \"{{book}}\" in the r/books with my comment \"{{content}}\".", + "instantiation_dict": { + "book": "Harry Potter", + "content": "Wonderful journey" + }, + "intent": "Post a review of my recent reading \"Harry Potter\" in the r/books with my comment \"Wonderful journey\".", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "Harry Potter", + "Wonderful journey" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 9 + }, + { + "sites": [ + "reddit" + ], + "task_id": 612, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a review of my recent reading \"{{book}}\" in the r/books with my comment \"{{content}}\".", + "instantiation_dict": { + "book": "big little lies", + "content": "can't stop it" + }, + "intent": "Post a review of my recent reading \"big little lies\" in the r/books with my comment \"can't stop it\".", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "big little lies", + "can't stop it" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 9 + }, + { + "sites": [ + "reddit" + ], + "task_id": 613, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a review of my recent reading \"{{book}}\" in the r/books with my comment \"{{content}}\".", + "instantiation_dict": { + "book": "Love story", + "content": "I cried" + }, + "intent": "Post a review of my recent reading \"Love story\" in the r/books with my comment \"I cried\".", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "Love story", + "I cried" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 9 + }, + { + "sites": [ + "reddit" + ], + "task_id": 614, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a review of my recent reading \"{{book}}\" in the r/books with my comment \"{{content}}\".", + "instantiation_dict": { + "book": "Gone with the wind", + "content": "It's a book with history" + }, + "intent": "Post a review of my recent reading \"Gone with the wind\" in the r/books with my comment \"It's a book with history\".", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "Gone with the wind", + "It's a book with history" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 9 + }, + { + "sites": [ + "reddit" + ], + "task_id": 615, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/pics", + "geolocation": null, + "intent_template": "Re-post the image of {{content}} in this page to {{subreddit}} subreddit and note \"from /f/pics\"", + "instantiation_dict": { + "content": "Bald Eagle", + "subreddit": "earthporn" + }, + "intent": "Re-post the image of Bald Eagle in this page to earthporn subreddit and note \"from /f/pics\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/earthporn", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "from /f/pics" + ] + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "[...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "b02113033af32feae9ff147dbbe3764039368d67d193885bd04e65c2e6beea9c.jpg" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 11 + }, + { + "sites": [ + "reddit" + ], + "task_id": 616, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/pics", + "geolocation": null, + "intent_template": "Re-post the image of {{content}} in this page to {{subreddit}} subreddit and note \"from /f/pics\"", + "instantiation_dict": { + "content": "Thanksgiving turkey", + "subreddit": "funny" + }, + "intent": "Re-post the image of Thanksgiving turkey in this page to funny subreddit and note \"from /f/pics\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/funny", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "from /f/pics" + ] + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "[...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "2e4fa0a328e653a97a7d07046291c298ef5b4e0d0c73a287f317ca86a8e8685f.jpg" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 11 + }, + { + "sites": [ + "reddit" + ], + "task_id": 617, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/pics", + "geolocation": null, + "intent_template": "Re-post the image of {{content}} in this page to {{subreddit}} subreddit and note \"from /f/pics\"", + "instantiation_dict": { + "content": "Firework", + "subreddit": "earthporn" + }, + "intent": "Re-post the image of Firework in this page to earthporn subreddit and note \"from /f/pics\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/earthporn", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "from /f/pics" + ] + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "[...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "92411be6af4e9ad5ccd3ccbaa01c10457bb00e704e99c58dd430de1a958307fd.jpg" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 11 + }, + { + "sites": [ + "reddit" + ], + "task_id": 618, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/pics", + "geolocation": null, + "intent_template": "Re-post the image of {{content}} in this page to {{subreddit}} subreddit and note \"from /f/pics\"", + "instantiation_dict": { + "content": "Wife's costume", + "subreddit": "funny" + }, + "intent": "Re-post the image of Wife's costume in this page to funny subreddit and note \"from /f/pics\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/funny", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "from /f/pics" + ] + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "[...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "6bfbf1280d28d84a9261695f0cac5a90addaaff1174807a2b381fdc159f3ed00.jpg" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 11 + }, + { + "sites": [ + "reddit" + ], + "task_id": 619, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/pics", + "geolocation": null, + "intent_template": "Re-post the image of {{content}} in this page to {{subreddit}} subreddit and note \"from /f/pics\"", + "instantiation_dict": { + "content": "costume contest", + "subreddit": "funny" + }, + "intent": "Re-post the image of costume contest in this page to funny subreddit and note \"from /f/pics\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/funny", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "from /f/pics" + ] + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "[...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "bd8bc5f4c846aac4df08626faa3a34a7d47c8f3bdd92bf615a54afd939f063a7.jpg" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 11 + }, + { + "sites": [ + "reddit" + ], + "task_id": 620, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for advice about {{issue}} in a subreddit for relations", + "instantiation_dict": { + "issue": "deal with long-distance relationships" + }, + "intent": "Ask for advice about deal with long-distance relationships in a subreddit for relations", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/relationship_advice", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "long", + "distance", + "relation" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 12 + }, + { + "sites": [ + "reddit" + ], + "task_id": 621, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for advice about {{issue}} in a subreddit for relations", + "instantiation_dict": { + "issue": "cheat" + }, + "intent": "Ask for advice about cheat in a subreddit for relations", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/relationship_advice", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "cheat" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 12 + }, + { + "sites": [ + "reddit" + ], + "task_id": 622, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for advice about {{issue}} in a subreddit for relations", + "instantiation_dict": { + "issue": "sexual harassment" + }, + "intent": "Ask for advice about sexual harassment in a subreddit for relations", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/relationship_advice", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "sexual", + "harassment" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 12 + }, + { + "sites": [ + "reddit" + ], + "task_id": 623, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for advice about {{issue}} in a subreddit for relations", + "instantiation_dict": { + "issue": "gift for birthday" + }, + "intent": "Ask for advice about gift for birthday in a subreddit for relations", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/relationship_advice", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "gift", + "birthday" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 12 + }, + { + "sites": [ + "reddit" + ], + "task_id": 624, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for advice about {{issue}} in a subreddit for relations", + "instantiation_dict": { + "issue": "break-up remedy" + }, + "intent": "Ask for advice about break-up remedy in a subreddit for relations", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/relationship_advice", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "break", + "remedy" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 12 + }, + { + "sites": [ + "reddit" + ], + "task_id": 625, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a discussion post about \"{{topic}}\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "instantiation_dict": { + "topic": "the effectiveness of online learning" + }, + "intent": "Create a discussion post about \"the effectiveness of online learning\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/machinelearning |OR| __REDDIT__/f/deeplearning", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "your opinion", + "the effectiveness of online learning" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 13 + }, + { + "sites": [ + "reddit" + ], + "task_id": 626, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a discussion post about \"{{topic}}\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "instantiation_dict": { + "topic": "Iphone 14" + }, + "intent": "Create a discussion post about \"Iphone 14\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/iphone", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "your opinion", + "Iphone 14" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 13 + }, + { + "sites": [ + "reddit" + ], + "task_id": 627, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a discussion post about \"{{topic}}\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "instantiation_dict": { + "topic": "Harry Potter movie series" + }, + "intent": "Create a discussion post about \"Harry Potter movie series\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/movies", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "your opinion", + "Harry Potter movie series" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 13 + }, + { + "sites": [ + "reddit" + ], + "task_id": 628, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a discussion post about \"{{topic}}\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "instantiation_dict": { + "topic": "long distance relationship" + }, + "intent": "Create a discussion post about \"long distance relationship\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/relationship_advice", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "your opinion", + "long distance relationship" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 13 + }, + { + "sites": [ + "reddit" + ], + "task_id": 629, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Create a discussion post about \"{{topic}}\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "instantiation_dict": { + "topic": "Fun thing to do in Pittsburgh" + }, + "intent": "Create a discussion post about \"Fun thing to do in Pittsburgh\" in a relevant subreddit and ask users for their opinions with the simple prompt, \"your opinion\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/pittsburgh", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "your opinion", + "Fun thing to do in Pittsburgh |OR| Fun things to do in Pittsburgh" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 13 + }, + { + "sites": [ + "reddit" + ], + "task_id": 630, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for product recommendations for {{category}} within a budget of {{price}} in {{subreddit}}", + "instantiation_dict": { + "category": "noise-cancelling headphones", + "price": "$200", + "subreddit": "r/headphones" + }, + "intent": "Ask for product recommendations for noise-cancelling headphones within a budget of $200 in r/headphones", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/headphones", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "200", + "noise-cancelling", + "headphone" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 15 + }, + { + "sites": [ + "reddit" + ], + "task_id": 631, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for product recommendations for {{category}} within a budget of {{price}} in {{subreddit}}", + "instantiation_dict": { + "category": "running shoes", + "price": "$100", + "subreddit": "r/sports" + }, + "intent": "Ask for product recommendations for running shoes within a budget of $100 in r/sports", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/sports", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "100", + "running", + "shoes" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 15 + }, + { + "sites": [ + "reddit" + ], + "task_id": 632, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for product recommendations for {{category}} within a budget of {{price}} in {{subreddit}}", + "instantiation_dict": { + "category": "running shoes", + "price": "$500", + "subreddit": "r/sports" + }, + "intent": "Ask for product recommendations for running shoes within a budget of $500 in r/sports", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/sports", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "500", + "running", + "shoes" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 15 + }, + { + "sites": [ + "reddit" + ], + "task_id": 633, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for product recommendations for {{category}} within a budget of {{price}} in {{subreddit}}", + "instantiation_dict": { + "category": "running pants", + "price": "$500", + "subreddit": "r/sports" + }, + "intent": "Ask for product recommendations for running pants within a budget of $500 in r/sports", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/sports", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "500", + "running", + "pants" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 15 + }, + { + "sites": [ + "reddit" + ], + "task_id": 634, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Ask for product recommendations for {{category}} within a budget of {{price}} in {{subreddit}}", + "instantiation_dict": { + "category": "used iphone", + "price": "$1000", + "subreddit": "r/iphone" + }, + "intent": "Ask for product recommendations for used iphone within a budget of $1000 in r/iphone", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/iphone", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "1000", + "used iphone" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 15 + }, + { + "sites": [ + "reddit" + ], + "task_id": 635, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in the most appropriate subreddit and ask for recommendations for {{category}} products within a budget of {{price}}", + "instantiation_dict": { + "category": "noise-cancelling headphones", + "price": "$200" + }, + "intent": "Post in the most appropriate subreddit and ask for recommendations for noise-cancelling headphones products within a budget of $200", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/headphones", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "200", + "noise-cancelling", + "headphone" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 6100 + }, + { + "sites": [ + "reddit" + ], + "task_id": 636, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in the most appropriate subreddit and ask for recommendations for {{category}} products within a budget of {{price}}", + "instantiation_dict": { + "category": "DIY toolkit", + "price": "$100" + }, + "intent": "Post in the most appropriate subreddit and ask for recommendations for DIY toolkit products within a budget of $100", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/DIY", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "100", + "DIY", + "toolkit" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 6100 + }, + { + "sites": [ + "reddit" + ], + "task_id": 637, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in the most appropriate subreddit and ask for recommendations for {{category}} products within a budget of {{price}}", + "instantiation_dict": { + "category": "sony headphones", + "price": "$500" + }, + "intent": "Post in the most appropriate subreddit and ask for recommendations for sony headphones products within a budget of $500", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/headphones", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "500", + "sony headphone" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 6100 + }, + { + "sites": [ + "reddit" + ], + "task_id": 638, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in the most appropriate subreddit and ask for recommendations for {{category}} products within a budget of {{price}}", + "instantiation_dict": { + "category": "must-have product in my life", + "price": "$30" + }, + "intent": "Post in the most appropriate subreddit and ask for recommendations for must-have product in my life products within a budget of $30", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/BuyItForLife", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "30", + "must-have", + "product", + "life" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 6100 + }, + { + "sites": [ + "reddit" + ], + "task_id": 639, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in the most appropriate subreddit and ask for recommendations for {{category}} products within a budget of {{price}}", + "instantiation_dict": { + "category": "used iphone", + "price": "$1000" + }, + "intent": "Post in the most appropriate subreddit and ask for recommendations for used iphone products within a budget of $1000", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/iphone", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "1000", + "used iphone" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 6100 + }, + { + "sites": [ + "reddit" + ], + "task_id": 640, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a notice on a virtual meetup for {{interest}} enthusiasts on {{date}} in the {{subreddit}} subreddit", + "instantiation_dict": { + "interest": "book reading", + "date": "March 15th", + "subreddit": "r/books" + }, + "intent": "Post a notice on a virtual meetup for book reading enthusiasts on March 15th in the r/books subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "book reading", + "Mar 15th |OR| March 15th", + "virtual", + "meetup" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 16 + }, + { + "sites": [ + "reddit" + ], + "task_id": 641, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a notice on a virtual meetup for {{interest}} enthusiasts on {{date}} in the {{subreddit}} subreddit", + "instantiation_dict": { + "interest": "Harry Potter", + "date": "July 8th", + "subreddit": "books" + }, + "intent": "Post a notice on a virtual meetup for Harry Potter enthusiasts on July 8th in the books subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "Harry Potter", + "Jul 8th |OR| July 8th", + "virtual", + "meetup" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 16 + }, + { + "sites": [ + "reddit" + ], + "task_id": 642, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a notice on a virtual meetup for {{interest}} enthusiasts on {{date}} in the {{subreddit}} subreddit", + "instantiation_dict": { + "interest": "Big little lies", + "date": "Sep 10th", + "subreddit": "books" + }, + "intent": "Post a notice on a virtual meetup for Big little lies enthusiasts on Sep 10th in the books subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "Big little lies", + "Sep 10th |OR| September 10th", + "virtual", + "meetup" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 16 + }, + { + "sites": [ + "reddit" + ], + "task_id": 643, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a notice on a virtual meetup for {{interest}} enthusiasts on {{date}} in the {{subreddit}} subreddit", + "instantiation_dict": { + "interest": "racing cars", + "date": "Oct 21st", + "subreddit": "nyc" + }, + "intent": "Post a notice on a virtual meetup for racing cars enthusiasts on Oct 21st in the nyc subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/nyc", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "racing cars", + "Oct 21st |OR| October 21st", + "virtual", + "meetup" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 16 + }, + { + "sites": [ + "reddit" + ], + "task_id": 644, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post a notice on a virtual meetup for {{interest}} enthusiasts on {{date}} in the {{subreddit}} subreddit", + "instantiation_dict": { + "interest": "Tears of Kingdom", + "date": "Dec 15th", + "subreddit": "gaming" + }, + "intent": "Post a notice on a virtual meetup for Tears of Kingdom enthusiasts on Dec 15th in the gaming subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/gaming", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "Tears of Kingdom", + "Dec 15th |OR| December 15th", + "virtual", + "meetup" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 16 + }, + { + "sites": [ + "reddit" + ], + "task_id": 645, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in {{subreddit}} subreddit about what could machine learning help the corresponding field.", + "instantiation_dict": { + "subreddit": "books" + }, + "intent": "Post in books subreddit about what could machine learning help the corresponding field.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "machine learning", + "help |OR| assist |OR| benefit |OR| improve |OR| enhance |OR| transform |OR| revolutionize" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 19 + }, + { + "sites": [ + "reddit" + ], + "task_id": 646, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in {{subreddit}} subreddit about what could midjourney help the corresponding field.", + "instantiation_dict": { + "subreddit": "DIY" + }, + "intent": "Post in DIY subreddit about what could midjourney help the corresponding field.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/diy", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "midjourney", + "help |OR| assist |OR| benefit |OR| improve |OR| enhance |OR| transform |OR| revolutionize" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 19 + }, + { + "sites": [ + "reddit" + ], + "task_id": 647, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in {{subreddit}} forum about what could open-source LLMs help the corresponding field.", + "instantiation_dict": { + "subreddit": "technology" + }, + "intent": "Post in technology forum about what could open-source LLMs help the corresponding field.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/technology", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "open-source LLMs", + "help |OR| assist |OR| benefit |OR| improve |OR| enhance |OR| transform |OR| revolutionize" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 19 + }, + { + "sites": [ + "reddit" + ], + "task_id": 648, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in {{subreddit}} forum about what could large language models help the corresponding field.", + "instantiation_dict": { + "subreddit": "dataisbeautiful" + }, + "intent": "Post in dataisbeautiful forum about what could large language models help the corresponding field.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/dataisbeautiful", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "large language models", + "help |OR| assist |OR| benefit |OR| improve |OR| enhance |OR| transform |OR| revolutionize" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 19 + }, + { + "sites": [ + "reddit" + ], + "task_id": 649, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Post in {{subreddit}} subreddit about what could diffusion model help the corresponding field.", + "instantiation_dict": { + "subreddit": "history" + }, + "intent": "Post in history subreddit about what could diffusion model help the corresponding field.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/history", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "diffusion model", + "help |OR| assist |OR| benefit |OR| improve |OR| enhance |OR| transform |OR| revolutionize" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 19 + }, + { + "sites": [ + "reddit" + ], + "task_id": 650, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/books/59421/friendly-reminder-bookshop-org-exists", + "geolocation": null, + "intent_template": "Reply to {{position_description}} with my comment \"{{content_description}}\"", + "instantiation_dict": { + "position_description": "the post", + "content_description": "I am a big fan of the bookorg" + }, + "intent": "Reply to the post with my comment \"I am a big fan of the bookorg\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/books/59421/friendly-reminder-bookshop-org-exists", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.comment__body').outerText", + "required_contents": { + "exact_match": "I am a big fan of the bookorg" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 23 + }, + { + "sites": [ + "reddit" + ], + "task_id": 651, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/pittsburgh/45899/driving-in-pittsburgh-summed-up-by-one-traffic-sign", + "geolocation": null, + "intent_template": "Reply to {{position_description}} with my comment \"{{content_description}}\"", + "instantiation_dict": { + "position_description": "the post", + "content_description": "Yeah, pittsburgh traffic, you know..." + }, + "intent": "Reply to the post with my comment \"Yeah, pittsburgh traffic, you know...\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/pittsburgh/45899/driving-in-pittsburgh-summed-up-by-one-traffic-sign", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.comment__body').outerText", + "required_contents": { + "exact_match": "Yeah, pittsburgh traffic, you know..." + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 23 + }, + { + "sites": [ + "reddit" + ], + "task_id": 652, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__/f/technology/134852/ai-experts-disown-musk-backed-campaign-citing-their-research", + "geolocation": null, + "intent_template": "Reply to {{position_description}} with my comment \"{{content_description}}\"", + "instantiation_dict": { + "position_description": "the post", + "content_description": "???" + }, + "intent": "Reply to the post with my comment \"???\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/technology/134852/ai-experts-disown-musk-backed-campaign-citing-their-research", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.comment__body').outerText", + "required_contents": { + "exact_match": "???" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 23 + }, + { + "sites": [ + "shopping" + ], + "task_id": 653, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Fill the \"contact us\" form in the site for a refund on the {{product}} I bought, stating that it broke after just three days of use. Also, ensure to include the order number #{{order_id}} and the product SKU. Don't submit yet, I will check.", + "instantiation_dict": { + "product": "phone screen protector", + "order_id": "000000180" + }, + "intent": "Fill the \"contact us\" form in the site for a refund on the phone screen protector I bought, stating that it broke after just three days of use. Also, ensure to include the order number #000000180 and the product SKU. Don't submit yet, I will check.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "000000180", + "B087QJN9W1" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 153 + }, + { + "sites": [ + "shopping" + ], + "task_id": 654, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Fill the \"contact us\" form in the site for a refund on the {{product}} I bought, stating that it broke after just three days of use. Also, ensure to include the order number #{{order_id}} and the product SKU. Don't submit yet, I will check.", + "instantiation_dict": { + "product": "bluetooth speaker", + "order_id": "161" + }, + "intent": "Fill the \"contact us\" form in the site for a refund on the bluetooth speaker I bought, stating that it broke after just three days of use. Also, ensure to include the order number #161 and the product SKU. Don't submit yet, I will check.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "161", + "B09P7BFL4H" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 153 + }, + { + "sites": [ + "shopping" + ], + "task_id": 655, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Fill the \"contact us\" form in the site for a refund on the {{product}} I bought, stating that it broke after just three days of use. Also, ensure to include the order number #{{order_id}} and the product SKU. Don't submit yet, I will check.", + "instantiation_dict": { + "product": "iphone case", + "order_id": "180" + }, + "intent": "Fill the \"contact us\" form in the site for a refund on the iphone case I bought, stating that it broke after just three days of use. Also, ensure to include the order number #180 and the product SKU. Don't submit yet, I will check.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "180", + "B087QJN9W1" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 153 + }, + { + "sites": [ + "shopping" + ], + "task_id": 656, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Fill the \"contact us\" form in the site for a refund on the {{product}} I bought, stating that it broke after just three days of use. Also, ensure to include the order number #{{order_id}} and the product SKU. Don't submit yet, I will check.", + "instantiation_dict": { + "product": "remote controller", + "order_id": "180" + }, + "intent": "Fill the \"contact us\" form in the site for a refund on the remote controller I bought, stating that it broke after just three days of use. Also, ensure to include the order number #180 and the product SKU. Don't submit yet, I will check.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "180", + "B0041MSF2S" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 153 + }, + { + "sites": [ + "shopping" + ], + "task_id": 657, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Fill the \"contact us\" form in the site for a refund on the {{product}} I bought, stating that it broke after just three days of use. Also, ensure to include the order number #{{order_id}} and the product SKU. Don't submit yet, I will check.", + "instantiation_dict": { + "product": "speaker", + "order_id": "148" + }, + "intent": "Fill the \"contact us\" form in the site for a refund on the speaker I bought, stating that it broke after just three days of use. Also, ensure to include the order number #148 and the product SKU. Don't submit yet, I will check.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "refund", + "broke", + "three days of use", + "148", + "B003FVW3VA" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 153 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 658, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create an issue in {{repo}} repo with title \"{{issue}}\". Assign the issue to {{account}}. Set due date to be {{due}}", + "instantiation_dict": { + "repo": "a11yproject", + "issue": "401 bad gateway", + "account": "Roshanjossey", + "due": "the end of 2030" + }, + "intent": "Create an issue in a11yproject repo with title \"401 bad gateway\". Assign the issue to Roshanjossey. Set due date to be the end of 2030", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[data-qa-selector=\"title_content\"]').outerText", + "required_contents": { + "exact_match": "401 bad gateway" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-testid=\"sidebar-due-date\"').outerText", + "required_contents": { + "must_include": [ + "Dec 31, 2030" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.assignee').outerText", + "required_contents": { + "must_include": [ + "Roshan Jossey" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 327 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 659, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create an issue in {{repo}} repo with title \"{{issue}}\". Assign the issue to {{account}}. Set due date to be {{due}}", + "instantiation_dict": { + "repo": "empathy-prompts", + "issue": "Integrating LLMs for better prompts", + "account": "Roshanjossey", + "due": "the beginning of Q2 2033" + }, + "intent": "Create an issue in empathy-prompts repo with title \"Integrating LLMs for better prompts\". Assign the issue to Roshanjossey. Set due date to be the beginning of Q2 2033", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/empathy-prompts/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[data-qa-selector=\"title_content\"]').outerText", + "required_contents": { + "exact_match": "Integrating LLMs for better prompts" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-testid=\"sidebar-due-date\"').outerText", + "required_contents": { + "must_include": [ + "Apr 1, 2033" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.assignee').outerText", + "required_contents": { + "must_include": [ + "Roshan Jossey" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 327 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 660, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create an issue in {{repo}} repo with title \"{{issue}}\". Assign the issue to {{account}}. Set due date to be {{due}}", + "instantiation_dict": { + "repo": "dotfiles", + "issue": "add support for oh-my-zsh", + "account": "Abishek", + "due": "July 18 2033" + }, + "intent": "Create an issue in dotfiles repo with title \"add support for oh-my-zsh\". Assign the issue to Abishek. Set due date to be July 18 2033", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/dotfiles/-/tree/main", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[data-qa-selector=\"title_content\"]').outerText", + "required_contents": { + "exact_match": "add support for oh-my-zsh" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-testid=\"sidebar-due-date\"').outerText", + "required_contents": { + "must_include": [ + "Jul 18, 2033" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.assignee').outerText", + "required_contents": { + "must_include": [ + "Abishek S" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 327 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 661, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open an issue to {{issue}} in {{repo}}.", + "instantiation_dict": { + "repo": "ChatGPT", + "issue": "report the issue of connection refused" + }, + "intent": "Open an issue to report the issue of connection refused in ChatGPT.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/convexegg/chatgpt/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "connection refused" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 328 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 662, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open an issue to {{issue}} in {{repo}}.", + "instantiation_dict": { + "repo": "aem-hacker", + "issue": "report experiencing \"OSError: [Errno 98] Address already in use\" during executions" + }, + "intent": "Open an issue to report experiencing \"OSError: [Errno 98] Address already in use\" during executions in aem-hacker.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/0ang3el/aem-hacker/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "OSError: [Errno 98] Address already in use" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 328 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 663, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open an issue to {{issue}} in {{repo}}.", + "instantiation_dict": { + "repo": "metaseq", + "issue": "ask their plan on supporting Llama and other llama family models" + }, + "intent": "Open an issue to ask their plan on supporting Llama and other llama family models in metaseq.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/root/metaseq/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "llama" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 328 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 664, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open an issue to {{issue}} in {{repo}}.", + "instantiation_dict": { + "repo": "awesome-python", + "issue": "ask their plans on adding Python 3.11 related resources" + }, + "intent": "Open an issue to ask their plans on adding Python 3.11 related resources in awesome-python.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/vinta/awesome-python/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "Python 3.11" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 328 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 665, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Open an issue to {{issue}} in {{repo}}.", + "instantiation_dict": { + "repo": "a11y-syntax-highlighting", + "issue": "request adding support for MT theme editor" + }, + "intent": "Open an issue to request adding support for MT theme editor in a11y-syntax-highlighting.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/a11y-syntax-highlighting/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "MT theme editor" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 328 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 666, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Submit a request to merge {{source_branch}} branch into {{target_branch}} branch, assign {{reviewer}} as the reviewer", + "instantiation_dict": { + "source_branch": "dialog-component", + "target_branch": "dialog", + "reviewer": "Carol" + }, + "intent": "Submit a request to merge dialog-component branch into dialog branch, assign Carol as the reviewer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/merge_requests", + "program_html": [ + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[1].outerText", + "required_contents": { + "exact_match": "dialog" + } + }, + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[0].outerText", + "required_contents": { + "exact_match": "dialog-component" + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.reviewer').outerText", + "required_contents": { + "must_include": [ + "Caroline Stewart" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 335 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 667, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Submit a merge request for {{source_branch}} branch to be merged into {{target_branch}} branch, assign {{reviewer}} as the reviewer", + "instantiation_dict": { + "source_branch": "dialog-component", + "target_branch": "bump-doctocat", + "reviewer": "primer" + }, + "intent": "Submit a merge request for dialog-component branch to be merged into bump-doctocat branch, assign primer as the reviewer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/merge_requests", + "program_html": [ + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[1].outerText", + "required_contents": { + "exact_match": "bump-doctocat" + } + }, + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[0].outerText", + "required_contents": { + "exact_match": "dialog-component" + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.reviewer').outerText", + "required_contents": { + "must_include": [ + "Primer" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 335 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 668, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Submit a merge request for {{source_branch}} branch to be merged into {{target_branch}} branch, assign {{reviewer}} as the reviewer", + "instantiation_dict": { + "source_branch": "a11yproject.com/redesign", + "target_branch": "master", + "reviewer": "Justin Armstrong" + }, + "intent": "Submit a merge request for a11yproject.com/redesign branch to be merged into master branch, assign Justin Armstrong as the reviewer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests", + "program_html": [ + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[0].outerText", + "required_contents": { + "exact_match": "redesign" + } + }, + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[1].outerText", + "required_contents": { + "exact_match": "main" + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.reviewer').outerText", + "required_contents": { + "must_include": [ + "Justin Armstrong" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 335 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 669, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/solarized-prism-theme", + "geolocation": null, + "intent_template": "Open a new issue to discuss the implementation of {{feature}}", + "instantiation_dict": { + "feature": "dark mode" + }, + "intent": "Open a new issue to discuss the implementation of dark mode", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/solarized-prism-theme/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "implementation", + "dark mode" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 337 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 670, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/byteblaze/dotfiles", + "geolocation": null, + "intent_template": "Open a new issue to discuss the implementation of {{feature}}", + "instantiation_dict": { + "feature": "default plugins for .zsh" + }, + "intent": "Open a new issue to discuss the implementation of default plugins for .zsh", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/dotfiles/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.detail-page-description').outerText", + "required_contents": { + "must_include": [ + "implementation", + "default plugins", + "zsh" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 337 + }, + { + "sites": [ + "shopping", + "reddit" + ], + "task_id": 671, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Gather the titles of {{product}} reviews with {{rating}} rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on {{product}}\"", + "instantiation_dict": { + "product": "Sony Computer Entertainment VR", + "rating": "2 stars and less" + }, + "intent": "Gather the titles of Sony Computer Entertainment VR reviews with 2 stars and less rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on Sony Computer Entertainment VR\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/gaming", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__title').outerText", + "required_contents": { + "exact_match": "real user feedback on Sony Computer Entertainment VR" + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "must_include": [ + "didn't last a year without issues", + "Disappointing. Didn't last long before it stopped powering on and needed to be sent in for repair.", + "Received used items!!" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 101 + }, + { + "sites": [ + "shopping", + "reddit" + ], + "task_id": 672, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Gather the titles of {{product}} reviews with {{rating}} rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on {{product}}\"", + "instantiation_dict": { + "product": "Nintendo Switch Fortnite Wildcat Console EU", + "rating": "3 stars and less" + }, + "intent": "Gather the titles of Nintendo Switch Fortnite Wildcat Console EU reviews with 3 stars and less rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on Nintendo Switch Fortnite Wildcat Console EU\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/gaming", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__title').outerText", + "required_contents": { + "exact_match": "real user feedback on Nintendo Switch Fortnite Wildcat Console EU" + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "must_include": [ + "EU charger and wild cat card doesn\u2019t even work!", + "REFUND REJECTED", + "Charging port not compatible", + "not compatible in the US", + "Wildcard Bonus Credits Not Redeemable!", + "Code not available!!" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 101 + }, + { + "sites": [ + "shopping", + "reddit" + ], + "task_id": 673, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Gather the titles of {{product}} reviews with {{rating}} rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on {{product}}\"", + "instantiation_dict": { + "product": "Racing Wheel Overdrive for Xbox X", + "rating": "1 star" + }, + "intent": "Gather the titles of Racing Wheel Overdrive for Xbox X reviews with 1 star rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on Racing Wheel Overdrive for Xbox X\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/gaming", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__title').outerText", + "required_contents": { + "exact_match": "real user feedback on Racing Wheel Overdrive for Xbox X" + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "must_include": [ + "Unable to set neutral steering", + "Doesn\u2019t work with PC", + "Crazy problems in automatic mode", + "pedals stopped working", + "Only works with certain games" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 101 + }, + { + "sites": [ + "shopping", + "reddit" + ], + "task_id": 674, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Gather the titles of {{product}} reviews with {{rating}} rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on {{product}}\"", + "instantiation_dict": { + "product": "Doc and Pies Arcade Factory Cocktail Arcade Machine", + "rating": "3 stars and less" + }, + "intent": "Gather the titles of Doc and Pies Arcade Factory Cocktail Arcade Machine reviews with 3 stars and less rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on Doc and Pies Arcade Factory Cocktail Arcade Machine\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/gaming", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__title').outerText", + "required_contents": { + "exact_match": "real user feedback on Doc and Pies Arcade Factory Cocktail Arcade Machine" + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "must_include": [ + "Poorly Made Exterior. Consider a different Company.", + "piece of junk ,..can't believe I spent money on this !!!!", + "Based arrived broken but game itself works" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 101 + }, + { + "sites": [ + "shopping", + "reddit" + ], + "task_id": 675, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Gather the titles of {{product}} reviews with {{rating}} rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on {{product}}\"", + "instantiation_dict": { + "product": "HORI 3D Surround Gaming Neckset", + "rating": "2 stars and less" + }, + "intent": "Gather the titles of HORI 3D Surround Gaming Neckset reviews with 2 stars and less rating from OneStopShop, and post them in the games subreddit under the title \"real user feedback on HORI 3D Surround Gaming Neckset\"", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/gaming", + "program_html": [ + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__title').outerText", + "required_contents": { + "exact_match": "real user feedback on HORI 3D Surround Gaming Neckset" + } + }, + { + "url": "func:reddit_get_post_url('__last_url__')", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "must_include": [ + "Not worth it for PC users", + "I really wanted to like this.", + "I wish this was better..." + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 101 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 676, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Lookup orders that are {{status}}", + "instantiation_dict": { + "status": "suspected of being fraudulent" + }, + "intent": "Lookup orders that are suspected of being fraudulent", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales/order/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div.admin__data-grid-filters-current\").outerText", + "required_contents": { + "must_include": [ + "Suspected Fraud" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 253 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 677, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Lookup orders that are {{status}}", + "instantiation_dict": { + "status": "processing" + }, + "intent": "Lookup orders that are processing", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales/order/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div.admin__data-grid-filters-current\").outerText", + "required_contents": { + "must_include": [ + "Processing" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 253 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 678, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Lookup orders that are {{status}}", + "instantiation_dict": { + "status": "canceled" + }, + "intent": "Lookup orders that are canceled", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales/order/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div.admin__data-grid-filters-current\").outerText", + "required_contents": { + "must_include": [ + "Canceled" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 253 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 679, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Lookup orders that are {{status}}", + "instantiation_dict": { + "status": "completed" + }, + "intent": "Lookup orders that are completed", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales/order/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div.admin__data-grid-filters-current\").outerText", + "required_contents": { + "must_include": [ + "Complete" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 253 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 680, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Lookup orders that are {{status}}", + "instantiation_dict": { + "status": "on hold" + }, + "intent": "Lookup orders that are on hold", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales/order/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div.admin__data-grid-filters-current\").outerText", + "required_contents": { + "must_include": [ + "On Hold" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 253 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 681, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a GitLab repository related to {{topic}} and make a Reddit post linking to it in a relevant subreddit", + "instantiation_dict": { + "topic": "gan implementation" + }, + "intent": "Find a GitLab repository related to gan implementation and make a Reddit post linking to it in a relevant subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/machinelearning |OR| __REDDIT__/f/deeplearning |OR| __REDDIT__/f/technology", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "gan implementation", + "__GITLAB__/eriklindernoren/PyTorch-GAN" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 116 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 682, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a GitLab repository related to {{topic}} and make a Reddit post linking to it in a relevant subreddit", + "instantiation_dict": { + "topic": "chatGPT" + }, + "intent": "Find a GitLab repository related to chatGPT and make a Reddit post linking to it in a relevant subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/machinelearning |OR| __REDDIT__/f/singularity |OR| __REDDIT__/f/deeplearning |OR| __REDDIT__/f/technology", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "chatgpt", + "__GITLAB__/convexegg/chatgpt" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 116 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 683, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Find a GitLab repository related to {{topic}} and make a Reddit post linking to it in a relevant subreddit", + "instantiation_dict": { + "topic": "metaseq" + }, + "intent": "Find a GitLab repository related to metaseq and make a Reddit post linking to it in a relevant subreddit", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/machinelearning |OR| __REDDIT__/f/deeplearning", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText", + "required_contents": { + "must_include": [ + "metaseq", + "__GITLAB__/root/metaseq" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 116 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 684, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Promote {{repo}} to subreddit {{subreddit}} with the description from the repo itself.", + "instantiation_dict": { + "repo": "byteblaze/cloud-to-butt", + "subreddit": "LifeProTips" + }, + "intent": "Promote byteblaze/cloud-to-butt to subreddit LifeProTips with the description from the repo itself.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/LifeProTips", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText + [...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "Chrome extension that replaces occurrences of 'the cloud' with 'my butt'", + "__GITLAB__/byteblaze/cloud-to-butt" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 117 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 685, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Promote {{repo}} to subreddit {{subreddit}} with the description from the repo itself.", + "instantiation_dict": { + "repo": "byteblaze/dotfiles", + "subreddit": "aww" + }, + "intent": "Promote byteblaze/dotfiles to subreddit aww with the description from the repo itself.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/aww", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText + [...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "Computer setup", + "__GITLAB__/byteblaze/dotfiles" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 117 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 686, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Promote {{repo}} to subreddit {{subreddit}} with the description from the repo itself.", + "instantiation_dict": { + "repo": "auth0/angular-storage", + "subreddit": "technology" + }, + "intent": "Promote auth0/angular-storage to subreddit technology with the description from the repo itself.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/technology", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText + [...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "A storage library for AngularJS done right", + "__GITLAB__/auth0/angular-storage" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 117 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 687, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Promote {{repo}} to subreddit {{subreddit}} with the description from the repo itself.", + "instantiation_dict": { + "repo": "koush/AndroidAsync", + "subreddit": "funny" + }, + "intent": "Promote koush/AndroidAsync to subreddit funny with the description from the repo itself.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/funny", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText + [...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "Asynchronous socket, http(s) (client+server) and websocket library for android. Based on nio, not threads.", + "__GITLAB__/koush/AndroidAsync" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 117 + }, + { + "sites": [ + "reddit", + "gitlab" + ], + "task_id": 688, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Promote {{repo}} to subreddit {{subreddit}} with the description from the repo itself.", + "instantiation_dict": { + "repo": "lahwaacz/arch-wiki-docs", + "subreddit": "science" + }, + "intent": "Promote lahwaacz/arch-wiki-docs to subreddit science with the description from the repo itself.", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__REDDIT__/f/science", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('.submission__inner').outerText + [...document.querySelector('.submission__inner').querySelectorAll('[href],[src]')].map(elem => elem.getAttribute('href') || elem.getAttribute('src')).join(' ')", + "required_contents": { + "must_include": [ + "A script to download pages from Arch Wiki for offline browsing", + "__GITLAB__/lahwaacz/arch-wiki-docs" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 117 + }, + { + "sites": [ + "shopping" + ], + "task_id": 689, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft an email to the shop owner via their contact us function for a coupon as {{reason}}", + "instantiation_dict": { + "reason": "I am a loyal customer" + }, + "intent": "Draft an email to the shop owner via their contact us function for a coupon as I am a loyal customer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "coupon", + "I am a loyal customer" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 163 + }, + { + "sites": [ + "shopping" + ], + "task_id": 690, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft an email to the shop owner via their contact us function for a coupon as {{reason}}", + "instantiation_dict": { + "reason": "they promised me a coupon last time" + }, + "intent": "Draft an email to the shop owner via their contact us function for a coupon as they promised me a coupon last time", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "coupon", + "promised" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 163 + }, + { + "sites": [ + "shopping" + ], + "task_id": 691, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft an email to the shop owner via their contact us function for a coupon as {{reason}}", + "instantiation_dict": { + "reason": "I plan to make a bulk purchase" + }, + "intent": "Draft an email to the shop owner via their contact us function for a coupon as I plan to make a bulk purchase", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "coupon", + "bulk purchase" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 163 + }, + { + "sites": [ + "shopping" + ], + "task_id": 692, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft an email to the shop owner via their contact us function for a coupon as {{reason}}", + "instantiation_dict": { + "reason": "I am a student" + }, + "intent": "Draft an email to the shop owner via their contact us function for a coupon as I am a student", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "coupon", + "student" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 163 + }, + { + "sites": [ + "shopping" + ], + "task_id": 693, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Draft an email to the shop owner via their contact us function for a coupon as {{reason}}", + "instantiation_dict": { + "reason": "my refund is suppoed to be replaced by a coupon" + }, + "intent": "Draft an email to the shop owner via their contact us function for a coupon as my refund is suppoed to be replaced by a coupon", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING__/contact", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[title=\"What\u2019s on your mind?\"').value", + "required_contents": { + "must_include": [ + "coupon", + "refund" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 163 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 694, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a simple product named {{product}} with {{stock}} in stock, available in size {{size}} and color {{color}}, priced at ${{price}}", + "instantiation_dict": { + "product": "Energy-Bulk Women Shirt", + "stock": "50", + "size": "S", + "color": "blue", + "price": "60" + }, + "intent": "Add a simple product named Energy-Bulk Women Shirt with 50 in stock, available in size S and color blue, priced at $60", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/catalog/product", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "60.00" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[name]\"').value", + "required_contents": { + "must_include": [ + "Energy-Bulk Women Shirt" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "50" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-role=\"selected-option\"').outerText", + "required_contents": { + "must_include": [ + "top" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[size]\"').value", + "required_contents": { + "exact_match": "167" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[color]\"').value", + "required_contents": { + "exact_match": "50" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-index=\"category_ids\"').outerText", + "required_contents": { + "must_include": [ + "tops" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 256 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 695, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a simple product named {{product}} with {{stock}} in stock, available in size {{size}} and color {{color}}, priced at ${{price}}", + "instantiation_dict": { + "product": "Energy-Bulk Man Yoga Pant", + "stock": "50", + "size": "38", + "color": "yellow", + "price": "69.99" + }, + "intent": "Add a simple product named Energy-Bulk Man Yoga Pant with 50 in stock, available in size 38 and color yellow, priced at $69.99", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/catalog/product", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "69.99" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[name]\"').value", + "required_contents": { + "must_include": [ + "Energy-Bulk Man Yoga Pant" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "50" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-role=\"selected-option\"').outerText", + "required_contents": { + "must_include": [ + "bottom" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[size]\"').value", + "required_contents": { + "exact_match": "179" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[color]\"').value", + "required_contents": { + "exact_match": "60" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-index=\"category_ids\"').outerText", + "required_contents": { + "must_include": [ + "bottoms" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 256 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 696, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a simple product named {{product}} with {{stock}} in stock, available in size {{size}} and color {{color}}, priced at ${{price}}", + "instantiation_dict": { + "product": "FancyBoy Man Causal Jeans", + "stock": "42", + "size": "34", + "color": "Blue", + "price": "169.99" + }, + "intent": "Add a simple product named FancyBoy Man Causal Jeans with 42 in stock, available in size 34 and color Blue, priced at $169.99", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/catalog/product", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"product[name]\"').value", + "required_contents": { + "must_include": [ + "FancyBoy Man Causal Jeans" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "42" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "169.99" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-role=\"selected-option\"').outerText", + "required_contents": { + "must_include": [ + "bottom" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[size]\"').value", + "required_contents": { + "exact_match": "177" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[color]\"').value", + "required_contents": { + "exact_match": "50" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-index=\"category_ids\"').outerText", + "required_contents": { + "must_include": [ + "bottoms" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 256 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 697, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a simple product named {{product}} with {{stock}} in stock, available in size {{size}} and color {{color}}, priced at ${{price}}", + "instantiation_dict": { + "product": "Swaatch Smart Watch", + "stock": "42", + "size": "uni-size", + "color": "Blue", + "price": "769.99" + }, + "intent": "Add a simple product named Swaatch Smart Watch with 42 in stock, available in size uni-size and color Blue, priced at $769.99", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/catalog/product", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"product[name]\"').value", + "required_contents": { + "must_include": [ + "Swaatch Smart Watch" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "42" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "769.99" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-role=\"selected-option\"').outerText", + "required_contents": { + "must_include": [ + "gear" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[color]\"').value", + "required_contents": { + "exact_match": "50" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-index=\"category_ids\"').outerText", + "required_contents": { + "must_include": [ + "watches" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 256 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 698, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Add a simple product named {{product}} with {{stock}} in stock, available in size {{size}} and color {{color}}, priced at ${{price}}", + "instantiation_dict": { + "product": "Lelelumon Yoga Mat", + "stock": "42", + "size": "uni-size", + "color": "black", + "price": "769.99" + }, + "intent": "Add a simple product named Lelelumon Yoga Mat with 42 in stock, available in size uni-size and color black, priced at $769.99", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/catalog/product", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"product[name]\"').value", + "required_contents": { + "must_include": [ + "Lelelumon Yoga Mat" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "42" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "769.99" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-role=\"selected-option\"').outerText", + "required_contents": { + "must_include": [ + "gear" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"product[color]\"').value", + "required_contents": { + "exact_match": "49" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-index=\"category_ids\"').outerText", + "required_contents": { + "must_include": [ + "fitness equipment" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 256 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 699, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Draft a new marketing price rule for {{topic}} that offers {{rule}} for all customers", + "instantiation_dict": { + "topic": "spring sale", + "rule": "a 20 percent discount site-wide" + }, + "intent": "Draft a new marketing price rule for spring sale that offers a 20 percent discount site-wide for all customers", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales_rule/promo_quote", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"[name='name'\").value", + "required_contents": { + "must_include": [ + "spring sale" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"website_ids\"').selectedIndex", + "required_contents": { + "exact_match": "0" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"customer_group_ids\"').selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"simple_action\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "by_percent" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"discount_amount\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "20" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 258 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 700, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Draft a new marketing price rule for {{topic}} that offers {{rule}} for all customers", + "instantiation_dict": { + "topic": "fall discount", + "rule": "$10 discount on checkout" + }, + "intent": "Draft a new marketing price rule for fall discount that offers $10 discount on checkout for all customers", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales_rule/promo_quote", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"[name='name'\").value", + "required_contents": { + "must_include": [ + "fall discount" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"website_ids\"').selectedIndex", + "required_contents": { + "exact_match": "0" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"customer_group_ids\"').selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"simple_action\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "cart_fixed" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"discount_amount\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "10" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 258 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 701, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Draft a new marketing price rule for {{topic}} that offers {{rule}} for all customers", + "instantiation_dict": { + "topic": "Mother's day sale", + "rule": "$15 discount on checkout" + }, + "intent": "Draft a new marketing price rule for Mother's day sale that offers $15 discount on checkout for all customers", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales_rule/promo_quote", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"[name='name'\").value", + "required_contents": { + "must_include": [ + "Mother's day sale" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"website_ids\"').selectedIndex", + "required_contents": { + "exact_match": "0" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"customer_group_ids\"').selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"simple_action\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "cart_fixed" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"discount_amount\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "15" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 258 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 702, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Draft a new marketing price rule for {{topic}} that offers {{rule}} for all customers", + "instantiation_dict": { + "topic": "Pride Month", + "rule": "45% off on all products" + }, + "intent": "Draft a new marketing price rule for Pride Month that offers 45% off on all products for all customers", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales_rule/promo_quote", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"[name='name'\").value", + "required_contents": { + "must_include": [ + "Pride Month" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"website_ids\"').selectedIndex", + "required_contents": { + "exact_match": "0" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"customer_group_ids\"').selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"simple_action\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "by_percent" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"discount_amount\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "45" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 258 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 703, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Draft a new marketing price rule for {{topic}} that offers {{rule}} for all customers", + "instantiation_dict": { + "topic": "Thanks giving sale", + "rule": "$40 discount on checkout" + }, + "intent": "Draft a new marketing price rule for Thanks giving sale that offers $40 discount on checkout for all customers", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/sales_rule/promo_quote", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"[name='name'\").value", + "required_contents": { + "must_include": [ + "Thanks giving sale" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"website_ids\"').selectedIndex", + "required_contents": { + "exact_match": "0" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"customer_group_ids\"').selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"simple_action\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "cart_fixed" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"discount_amount\"').value", + "prep_actions": ["document.querySelector('[data-index=\"actions\"]').querySelector('.admin__collapsible-title').click()"], + "required_contents": { + "exact_match": "40" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 258 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 704, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Today is 3/15/2023, generate a {{report}} {{time_span}}", + "instantiation_dict": { + "report": "sales order report", + "time_span": "for last month" + }, + "intent": "Today is 3/15/2023, generate a sales order report for last month", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/sales", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "2/1/23" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "2/28/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 268 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 705, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Today is 3/15/2023, generate a {{report}} {{time_span}}", + "instantiation_dict": { + "report": "sales order report", + "time_span": "over the last 45 days" + }, + "intent": "Today is 3/15/2023, generate a sales order report over the last 45 days", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/sales", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "1/29/23" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "3/15/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 268 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 706, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Today is 3/15/2023, generate a {{report}} {{time_span}}", + "instantiation_dict": { + "report": "refund report", + "time_span": "for Q1" + }, + "intent": "Today is 3/15/2023, generate a refund report for Q1", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/refunded", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "1/1/23" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "3/31/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 268 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 707, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Today is 3/15/2023, generate a {{report}} {{time_span}}", + "instantiation_dict": { + "report": "sales order report", + "time_span": "for last year" + }, + "intent": "Today is 3/15/2023, generate a sales order report for last year", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/sales", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "1/1/22" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "12/31/22" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 268 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 708, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Today is 3/15/2023, generate a {{report}} {{time_span}}", + "instantiation_dict": { + "report": "tax report", + "time_span": "for this year" + }, + "intent": "Today is 3/15/2023, generate a tax report for this year", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/tax/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "1/1/23" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "12/31/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 268 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 709, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Create an {{type}} report from {{start_date}} to {{end_date}}", + "instantiation_dict": { + "type": "orders", + "start_date": "beginning of May 2021", + "end_date": "end of March 2022" + }, + "intent": "Create an orders report from beginning of May 2021 to end of March 2022", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/sales", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "5/1/21" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "3/31/22" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 271 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 710, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Create a {{type}} report from {{start_date}} to {{end_date}}", + "instantiation_dict": { + "type": "shipping", + "start_date": "08/05/2022", + "end_date": "03/01/2023" + }, + "intent": "Create a shipping report from 08/05/2022 to 03/01/2023", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/shipping", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "8/5/22" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "3/1/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 271 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 711, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Create a {{type}} report from {{start_date}} to {{end_date}}", + "instantiation_dict": { + "type": "product view", + "start_date": "07/05/2021", + "end_date": "05/31/2023" + }, + "intent": "Create a product view report from 07/05/2021 to 05/31/2023", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_product/viewed/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "7/5/21" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "5/31/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 271 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 712, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Create a {{type}} report from {{start_date}} to {{end_date}}", + "instantiation_dict": { + "type": "coupons", + "start_date": "05/01/2021", + "end_date": "05/15/2023" + }, + "intent": "Create a coupons report from 05/01/2021 to 05/15/2023", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/coupons/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "5/1/21" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "5/15/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 271 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 713, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Create a {{type}} report from {{start_date}} to {{end_date}}", + "instantiation_dict": { + "type": "best sellers", + "start_date": "05/01/2022", + "end_date": "05/31/2023" + }, + "intent": "Create a best sellers report from 05/01/2022 to 05/31/2023", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__SHOPPING_ADMIN__/reports/report_sales/bestsellers/", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_from\"').value", + "required_contents": { + "exact_match": "5/1/22" + } + }, + { + "url": "last", + "locator": "document.querySelector('[id=\"sales_report_to\"').value", + "required_contents": { + "exact_match": "5/31/23" + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 271 + }, + { + "sites": [ + "reddit" + ], + "task_id": 714, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Thumbs down the top {{k}} post ever in {{subreddit}}.", + "instantiation_dict": { + "subreddit": "gadgets", + "k": "1" + }, + "intent": "Thumbs down the top 1 post ever in gadgets.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/gadgets/19459/a-custom-gaming-pc-built-inside-a-vintage-1940s-motorola", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 24 + }, + { + "sites": [ + "reddit" + ], + "task_id": 715, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Thumbs down the top {{k}} post ever in {{subreddit}}.", + "instantiation_dict": { + "subreddit": "history", + "k": "2" + }, + "intent": "Thumbs down the top 2 post ever in history.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/history/84338/the-scientist-who-discovered-sperm-was-so-grossed-out-he", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/history/105990/4-500-year-old-sumerian-temple-dedicated-to-mighty-thunder", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 24 + }, + { + "sites": [ + "reddit" + ], + "task_id": 716, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Thumbs down the top {{k}} post ever in {{subreddit}}.", + "instantiation_dict": { + "k": "3", + "subreddit": "books" + }, + "intent": "Thumbs down the top 3 post ever in books.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/books/81371/the-letters-of-t-s-eliot-to-emily-hale-that-were-kept-sealed", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/books/59421/friendly-reminder-bookshop-org-exists", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/books/59447/appalachian-prison-book-project-seeks-notebook-donations-the", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 24 + }, + { + "sites": [ + "reddit" + ], + "task_id": 717, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Thumbs down the top {{k}} post ever in {{subreddit}}.", + "instantiation_dict": { + "k": "4", + "subreddit": "movies" + }, + "intent": "Thumbs down the top 4 post ever in movies.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/movies/86174/who-will-win-the-oscar-for-actress-in-a-supporting-role", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/movies/86029/who-will-win-the-oscar-for-film-editing", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/movies/86055/cindy-williams-dies-laverne-amp-shirley-star-who-appeared-in", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/movies/42682/michelle-yeoh-to-receive-palm-springs-film-festival-s", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 24 + }, + { + "sites": [ + "reddit" + ], + "task_id": 718, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Thumbs down the top {{k}} post ever in {{subreddit}}.", + "instantiation_dict": { + "k": "5", + "subreddit": "technology" + }, + "intent": "Thumbs down the top 5 post ever in technology.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/technology/48670/brain-cancer-vaccine-succeeds-at-prolonging-survival-in", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/technology/134696/india-cuts-internet-for-27-million-people-amid-search-for", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/technology/48785/us-judge-orders-amazon-to-cease-and-desist-anti-union", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/technology/70354/activision-s-boston-studio-workers-announce-unionization", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/technology/70233/social-media-influencers-are-charged-with-feeding-followers", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 24 + }, + { + "sites": [ + "reddit" + ], + "task_id": 719, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Like all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "subreddit": "wallstreetbets", + "user": "ThetaGang_wsb" + }, + "intent": "Like all submissions created by ThetaGang_wsb in subreddit wallstreetbets", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/wallstreetbets/29478/how-will-airbnb-close-following-their-earnings-report-on", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/wallstreetbets/29458/how-much-will-the-federal-reserve-raise-interest-rates-in", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 25 + }, + { + "sites": [ + "reddit" + ], + "task_id": 720, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Like all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "subreddit": "earthporn", + "user": "CameronKelsey" + }, + "intent": "Like all submissions created by CameronKelsey in subreddit earthporn", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/EarthPorn/98332/my-favorite-place-on-the-planet-henry-s-fork-of-the-snake", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/EarthPorn/98297/2-years-later-this-is-still-one-of-the-most-incredible", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/EarthPorn/98256/i-can-t-wait-for-all-this-green-to-start-coming-back-little", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 25 + }, + { + "sites": [ + "reddit" + ], + "task_id": 721, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Like all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "UniversityofBath", + "subreddit": "IAmA" + }, + "intent": "Like all submissions created by UniversityofBath in subreddit IAmA", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/IAmA/119742/hi-i-m-vienne-a-doctoral-student-at-the-university-of-bath-i", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/119719/hello-reddit-i-m-nazia-mehrban-a-lecturer-in-biotechnology", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/119714/i-m-ellie-jarvis-she-her-a-2nd-year-phd-student-in-the", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/55155/hi-i-m-dr-lucy-maddox-from-bath-university-uk-i-m-a-clinical", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/55142/we-re-sadeka-nujhat-hannah-leese-and-sandhya-moise-from-the", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/34032/we-re-sandhya-moise-david-phillips-and-chan-lee-from-the", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/13175/hi-i-m-kit-yates-i-m-a-mathematical-biologist-at-the", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/IAmA/13170/hello-i-m-dr-sara-fontani-from-the-university-of", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 25 + }, + { + "sites": [ + "reddit" + ], + "task_id": 722, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Like all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "Don_Gato1", + "subreddit": "new york" + }, + "intent": "Like all submissions created by Don_Gato1 in subreddit new york", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/nyc/44650/fox-news-hosts-cast-new-york-as-crime-ridden-and-chaotic", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 25 + }, + { + "sites": [ + "reddit" + ], + "task_id": 723, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Like all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "FTorrez81", + "subreddit": "iphone13" + }, + "intent": "Like all submissions created by FTorrez81 in subreddit iphone13", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "reference_answer_raw_annotation": "N/A", + "string_note": "FTorrez81 does not have any submissions in iphone13" + }, + "intent_template_id": 25, + "string_note": "FTorrez81 has no submissions in subreddit iphone13" + }, + { + "sites": [ + "reddit" + ], + "task_id": 724, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Like all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "Hrekires", + "subreddit": "news" + }, + "intent": "Like all submissions created by Hrekires in subreddit news", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/news/129816/gov-whitmer-signs-bills-to-repeal-right-to-work-restore", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129808/disney-world-deal-with-union-will-raise-minimum-wage-to-18", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129794/judge-halts-wyoming-abortion-ban-days-after-it-took-effect", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129783/don-t-say-gay-lawmaker-pleads-guilty-to-covid-relief-fraud", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129594/arizona-gov-katie-hobbs-refuses-to-proceed-with-execution", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129508/tennessee-governor-oks-bill-to-cut-nashville-council-in-half", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43839/philadelphia-da-larry-krasner-impeached-by-pa-house", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43781/crypto-giant-ftx-to-file-for-bankruptcy-ceo-sam-bankman", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43572/sec-doj-investigating-crypto-platform-ftx", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43558/kansas-gov-laura-kelly-wins-re-election-defeating-gop", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-upvoted" + ] + } + } + ] + }, + "intent_template_id": 25 + }, + { + "sites": [ + "reddit" + ], + "task_id": 725, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "DisLike all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "subreddit": "massachusetts", + "user": "RickyDontLoseThat" + }, + "intent": "DisLike all submissions created by RickyDontLoseThat in subreddit massachusetts", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/massachusetts/84954/the-last-of-lincoln", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 1510 + }, + { + "sites": [ + "reddit" + ], + "task_id": 726, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "DisLike all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "subreddit": "earthporn", + "user": "jacyanthis" + }, + "intent": "DisLike all submissions created by jacyanthis in subreddit earthporn", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "jacyanthis does not have any submissions in earthporn", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 1510 + }, + { + "sites": [ + "reddit" + ], + "task_id": 727, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "DisLike all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "PatientBuilder499", + "subreddit": "videos" + }, + "intent": "DisLike all submissions created by PatientBuilder499 in subreddit videos", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/videos/115139/hundreds-of-civilian-turkish-volunteers-waiting-to-be-sent", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 1510 + }, + { + "sites": [ + "reddit" + ], + "task_id": 728, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "DisLike all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "sirbarani", + "subreddit": "sports" + }, + "intent": "DisLike all submissions created by sirbarani in subreddit sports", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/sports/48303/iran-football-legend-daei-will-not-attend-world-cup-amid", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 1510 + }, + { + "sites": [ + "reddit" + ], + "task_id": 729, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "DisLike all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "AdamCannon", + "subreddit": "UpliftingNews" + }, + "intent": "DisLike all submissions created by AdamCannon in subreddit UpliftingNews", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/UpliftingNews/16087/same-sex-marriage-is-now-legal-in-all-of-mexico-s-states", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 1510 + }, + { + "sites": [ + "reddit" + ], + "task_id": 730, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "DisLike all submissions created by {{user}} in subreddit {{subreddit}}", + "instantiation_dict": { + "user": "Hrekires", + "subreddit": "news" + }, + "intent": "DisLike all submissions created by Hrekires in subreddit news", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/news/129816/gov-whitmer-signs-bills-to-repeal-right-to-work-restore", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129808/disney-world-deal-with-union-will-raise-minimum-wage-to-18", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129794/judge-halts-wyoming-abortion-ban-days-after-it-took-effect", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129783/don-t-say-gay-lawmaker-pleads-guilty-to-covid-relief-fraud", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129594/arizona-gov-katie-hobbs-refuses-to-proceed-with-execution", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/129508/tennessee-governor-oks-bill-to-cut-nashville-council-in-half", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43839/philadelphia-da-larry-krasner-impeached-by-pa-house", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43781/crypto-giant-ftx-to-file-for-bankruptcy-ceo-sam-bankman", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43572/sec-doj-investigating-crypto-platform-ftx", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + }, + { + "url": "__REDDIT__/f/news/43558/kansas-gov-laura-kelly-wins-re-election-defeating-gop", + "locator": "document.querySelector('div.submission__vote').querySelector('form').getAttribute('class')", + "required_contents": { + "must_include": [ + "vote vote--user-downvoted" + ] + } + } + ] + }, + "intent_template_id": 1510 + }, + { + "sites": [ + "reddit" + ], + "task_id": 731, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Edit my post on {{post}} by adding a line to the body that says \"{{content}}\"", + "instantiation_dict": { + "post": "Nvidia RTX 4090", + "content": "EDIT: This news aged well" + }, + "intent": "Edit my post on Nvidia RTX 4090 by adding a line to the body that says \"EDIT: This news aged well\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/MachineLearning/1/nvidia-rtx-4090", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "must_include": [ + "EDIT: This news aged well", + "Crazy device for ML!" + ] + } + } + ] + }, + "intent_template_id": 27 + }, + { + "sites": [ + "reddit" + ], + "task_id": 732, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Edit my post on {{post}} by adding a line to the body that says \"{{content}}\"", + "instantiation_dict": { + "post": "The Night Agent", + "content": "Done watching, pretty cool!" + }, + "intent": "Edit my post on The Night Agent by adding a line to the body that says \"Done watching, pretty cool!\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/television/134868/the-night-agent-renewed-for-season-2-at-netflix", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "exact_match": "Done watching, pretty cool!" + } + } + ] + }, + "intent_template_id": 27 + }, + { + "sites": [ + "reddit" + ], + "task_id": 733, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Edit my post on {{post}} by adding a line to the body that says \"{{content}}\"", + "instantiation_dict": { + "post": "Star Trek Starfleet Academy series", + "content": "Every watch makes me feel like a kid again" + }, + "intent": "Edit my post on Star Trek Starfleet Academy series by adding a line to the body that says \"Every watch makes me feel like a kid again\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/television/135201/star-trek-starfleet-academy-series-from-alex-kurtzman-and", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "exact_match": "Every watch makes me feel like a kid again" + } + } + ] + }, + "intent_template_id": 27 + }, + { + "sites": [ + "reddit" + ], + "task_id": 734, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Edit my post on {{post}} by adding a line to the body that says \"{{content}}\"", + "instantiation_dict": { + "post": "Ted Lasso", + "content": "Done watching. I love the renew!" + }, + "intent": "Edit my post on Ted Lasso by adding a line to the body that says \"Done watching. I love the renew!\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/television/135156/ted-lasso-season-3-premiere-scores-870k-u-s-households-up-59", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "exact_match": "Done watching. I love the renew!" + } + } + ] + }, + "intent_template_id": 27 + }, + { + "sites": [ + "reddit" + ], + "task_id": 735, + "require_login": true, + "storage_state": "./.auth/reddit_state.json", + "start_url": "__REDDIT__", + "geolocation": null, + "intent_template": "Edit my post on {{post}} by adding a line to the body that says \"{{content}}\"", + "instantiation_dict": { + "post": "Lord of the Rings", + "content": "The cast is amazing!" + }, + "intent": "Edit my post on Lord of the Rings by adding a line to the body that says \"The cast is amazing!\"", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__REDDIT__/f/television/135152/lord-of-the-rings-the-rings-of-power-season-2-cast-adds", + "locator": "document.querySelector('.submission__body').outerText", + "required_contents": { + "exact_match": "The cast is amazing!" + } + } + ] + }, + "intent_template_id": 27 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 736, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Make the LICENSE of {{repo}} to MIT license.", + "instantiation_dict": { + "repo": "gimmiethat.space and dotfiles" + }, + "intent": "Make the LICENSE of gimmiethat.space and dotfiles to MIT license.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/gimmiethat.space/-/blob/main/LICENSE", + "locator": "", + "required_contents": { + "must_include": [ + "MIT license", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." + ] + } + }, + { + "url": "__GITLAB__/byteblaze/dotfiles/-/blob/main/LICENSE", + "locator": "", + "required_contents": { + "must_include": [ + "MIT license", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." + ] + } + } + ] + }, + "intent_template_id": 355 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 737, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the way from {{location}} to the home stadium of {{sport_team}} {{time}}", + "instantiation_dict": { + "location": "Carnegie Mellon University", + "sport_team": "Philadelphia 76ers", + "time": "" + }, + "intent": "Show me the way from Carnegie Mellon University to the home stadium of Philadelphia 76ers ", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Mellon University", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Wells Fargo Center", + "South Philadelphia Sports Complex" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 94 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 738, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the way from {{location}} to the home stadium of {{sport_team}} {{time}}", + "instantiation_dict": { + "location": "Carnegie Mellon University", + "sport_team": "Philadelphia 76ers", + "time": "in the 70th" + }, + "intent": "Show me the way from Carnegie Mellon University to the home stadium of Philadelphia 76ers in the 70th", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Mellon University", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "3601 South Broad Street", + "South Philadelphia" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 94 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 739, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the way from {{location}} to the home stadium of {{sport_team}} {{time}}", + "instantiation_dict": { + "location": "Carnegie Mellon University", + "sport_team": "Yankees", + "time": "in the 80th" + }, + "intent": "Show me the way from Carnegie Mellon University to the home stadium of Yankees in the 80th", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Mellon University", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Yankee Stadium", + "East 161st Street" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 94 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 740, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the way from {{location}} to the home stadium of {{sport_team}} {{time}}", + "instantiation_dict": { + "location": "Carnegie Mellon University", + "sport_team": "NYC NBA team", + "time": "" + }, + "intent": "Show me the way from Carnegie Mellon University to the home stadium of NYC NBA team ", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Mellon University", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Madison Square Garden", + "Pennsylvania Plaza", + "Manhattan", + "New York" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 94 + }, + { + "sites": [ + "wikipedia", + "map" + ], + "task_id": 741, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the way from {{location}} to the home stadium of {{sport_team}} {{time}}", + "instantiation_dict": { + "location": "Carnegie Mellon University", + "sport_team": "Boston home NBA team", + "time": "" + }, + "intent": "Show me the way from Carnegie Mellon University to the home stadium of Boston home NBA team ", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Mellon University", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "TD Garden", + "Boston", + "Massachusetts" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 94 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 742, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a new {{scope}} project \"planner\" and add {{account_list}} as members", + "instantiation_dict": { + "scope": "private", + "account_list": "Abishek, Vinta" + }, + "intent": "Create a new private project \"planner\" and add Abishek, Vinta as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/planner", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/planner/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@abisubramanya27", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 743, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a new {{scope}} project \"web_arena\" and add {{account_list}} as members", + "instantiation_dict": { + "scope": "public", + "account_list": "Abishek, Vinta" + }, + "intent": "Create a new public project \"web_arena\" and add Abishek, Vinta as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/web_arena", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "public" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_arena/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@abisubramanya27", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 744, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a new {{scope}} project \"AutoAGI\" and add {{account_list}} as members", + "instantiation_dict": { + "scope": "public", + "account_list": "primer" + }, + "intent": "Create a new public project \"AutoAGI\" and add primer as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/AutoAGI", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "public" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/AutoAGI/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@primer" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 745, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a new {{scope}} project \"awesome-llms\" and add {{account_list}} as members", + "instantiation_dict": { + "scope": "public", + "account_list": "primer, convexegg, abishek" + }, + "intent": "Create a new public project \"awesome-llms\" and add primer, convexegg, abishek as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/awesome-llms", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "public" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/awesome-llms/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@primer", + "@convexegg", + "@abisubramanya27" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 746, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a new {{scope}} project \"llm_bulk_inference\" and add {{account_list}} as members", + "instantiation_dict": { + "scope": "private", + "account_list": "primer, convexegg, abishek" + }, + "intent": "Create a new private project \"llm_bulk_inference\" and add primer, convexegg, abishek as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/llm_bulk_inference", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/llm_bulk_inference/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@primer", + "@convexegg", + "@abisubramanya27" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 747, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Start a private project {{project_name}} with {{template}} template and add {{account_list}} as members", + "instantiation_dict": { + "project_name": "awesome_web_agents", + "template": "blank", + "account_list": "Abishek, Vinta" + }, + "intent": "Start a private project awesome_web_agents with blank template and add Abishek, Vinta as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/awesome_web_agents", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/awesome_web_agents/-/commits", + "locator": "", + "required_contents": { + "must_include": [ + "Initial commit" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/awesome_web_agents/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@abisubramanya27", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 2100 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 748, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Start a private project {{project_name}} with {{template}} template and add {{account_list}} as members", + "instantiation_dict": { + "project_name": "web_agent_android_xl", + "template": "Android", + "account_list": "primer, convexegg, abishek" + }, + "intent": "Start a private project web_agent_android_xl with Android template and add primer, convexegg, abishek as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/web_agent_android_xl", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_agent_android_xl/-/commits", + "locator": "", + "required_contents": { + "must_include": [ + "Initialized from 'Android' project template" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_agent_android_xl/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@primer", + "@convexegg", + "@abisubramanya27" + ] + } + } + ] + }, + "intent_template_id": 2100 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 749, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Start a private project {{project_name}} with {{template}} template and add {{account_list}} as members", + "instantiation_dict": { + "project_name": "project_site", + "template": "NodeJS", + "account_list": "primer, convexegg, vinta" + }, + "intent": "Start a private project project_site with NodeJS template and add primer, convexegg, vinta as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/project_site", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/project_site/-/commits", + "locator": "", + "required_contents": { + "must_include": [ + "Initialized from 'NodeJS Express' project template" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/project_site/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@primer", + "@convexegg", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 2100 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 750, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Start a private project {{project_name}} with {{template}} template and add {{account_list}} as members", + "instantiation_dict": { + "project_name": "agi_index", + "template": "HTML", + "account_list": "Vinta Chen" + }, + "intent": "Start a private project agi_index with HTML template and add Vinta Chen as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/agi_index", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/agi_index", + "locator": "document.querySelector('.home-panel-description-markdown').outerText", + "required_contents": { + "must_include": [ + "Example plain HTML site using GitLab Pages: https://pages.gitlab.io/plain-html |OR| A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features." + ] + } + }, + { + "url": "__GITLAB__/byteblaze/agi_index/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "Vinta Chen" + ] + } + } + ] + }, + "intent_template_id": 2100 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 751, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Start a private project {{project_name}} with {{template}} template and add {{account_list}} as members", + "instantiation_dict": { + "project_name": "AGISite", + "template": "JEKYLL", + "account_list": "Rohan and Vinta" + }, + "intent": "Start a private project AGISite with JEKYLL template and add Rohan and Vinta as members", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/AGISite", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/AGISite", + "locator": "document.querySelector('.home-panel-description-markdown').outerText", + "required_contents": { + "must_include": [ + "Example Jekyll site using GitLab Pages: https://pages.gitlab.io/jekyll |OR| A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features." + ] + } + }, + { + "url": "__GITLAB__/byteblaze/AGISite/-/project_members", + "locator": "", + "required_contents": { + "must_include": [ + "@Seirdy", + "@vinta" + ] + } + } + ] + }, + "intent_template_id": 2100 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 752, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a private {{template}} repository called \"{{project_name}}\" using the right template to speed up development.", + "instantiation_dict": { + "project_name": "web_agent", + "template": "blank" + }, + "intent": "Create a private blank repository called \"web_agent\" using the right template to speed up development.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/web_agent", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_agent/-/commits", + "locator": "", + "required_contents": { + "must_include": [ + "Initial commit" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 753, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a private {{template}} repository called \"{{project_name}}\" using the right template to speed up development.", + "instantiation_dict": { + "project_name": "web_agent_android_xs", + "template": "Android" + }, + "intent": "Create a private Android repository called \"web_agent_android_xs\" using the right template to speed up development.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/web_agent_android_xs", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_agent_android_xs/-/commits", + "locator": "", + "required_contents": { + "must_include": [ + "Initialized from 'Android' project template" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 754, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a private {{template}} repository called \"{{project_name}}\" using the right template to speed up development.", + "instantiation_dict": { + "project_name": "web_agent_nodejs", + "template": "NodeJS" + }, + "intent": "Create a private NodeJS repository called \"web_agent_nodejs\" using the right template to speed up development.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/web_agent_nodejs", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_agent_nodejs/-/commits", + "locator": "", + "required_contents": { + "must_include": [ + "Initialized from 'NodeJS Express' project template" + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 755, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a private {{template}} repository called \"{{project_name}}\" using the right template to speed up development.", + "instantiation_dict": { + "project_name": "web_agent_index", + "template": "HTML" + }, + "intent": "Create a private HTML repository called \"web_agent_index\" using the right template to speed up development.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/web_agent_index", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/web_agent_index", + "locator": "document.querySelector('.home-panel-description-markdown').outerText", + "required_contents": { + "must_include": [ + "Example plain HTML site using GitLab Pages: https://pages.gitlab.io/plain-html |OR| A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features." + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 756, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create a private {{template}} repository called \"{{project_name}}\" using the right template to speed up development.", + "instantiation_dict": { + "project_name": "11711_gitlab", + "template": "JEKYLL" + }, + "intent": "Create a private JEKYLL repository called \"11711_gitlab\" using the right template to speed up development.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/byteblaze/11711_gitlab", + "locator": "document.querySelector('.visibility-icon').getAttribute('title')", + "required_contents": { + "must_include": [ + "Private" + ] + } + }, + { + "url": "__GITLAB__/byteblaze/11711_gitlab", + "locator": "document.querySelector('.home-panel-description-markdown').outerText", + "required_contents": { + "must_include": [ + "Example Jekyll site using GitLab Pages: https://pages.gitlab.io/jekyll |OR| A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features." + ] + } + } + ] + }, + "intent_template_id": 332 + }, + { + "sites": [ + "map" + ], + "task_id": 757, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the path and travel time from {{city1}} to {{city2}}.", + "instantiation_dict": { + "city1": "home of the 1980 Super Bowl champions", + "city2": "home of the 1991 Super Bowl champions" + }, + "intent": "Show me the path and travel time from home of the 1980 Super Bowl champions to home of the 1991 Super Bowl champions.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "New York" + ] + } + } + ] + }, + "intent_template_id": 42 + }, + { + "sites": [ + "map" + ], + "task_id": 758, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the path and travel time from {{city1}} to {{city2}}.", + "instantiation_dict": { + "city1": "the big apple", + "city2": "biggest city in Maine" + }, + "intent": "Show me the path and travel time from the big apple to biggest city in Maine.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "New York" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Portland", + "Maine" + ] + } + } + ] + }, + "intent_template_id": 42 + }, + { + "sites": [ + "map", + "shopping_admin" + ], + "task_id": 759, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the route and driving time from {{city1}} to {{city2}}", + "instantiation_dict": { + "city1": "the city where my E-commerce customer Sophia Young lives", + "city2": "New York City" + }, + "intent": "Show me the route and driving time from the city where my E-commerce customer Sophia Young lives to New York City", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Boston" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "New York" + ] + } + } + ] + }, + "intent_template_id": 42 + }, + { + "sites": [ + "map", + "shopping_admin" + ], + "task_id": 760, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Show me the route and driving time from {{city1}} to {{city2}}", + "instantiation_dict": { + "city1": "Allentown, PA", + "city2": "the city where my E-commerce customer Amanda Kim lives" + }, + "intent": "Show me the route and driving time from Allentown, PA to the city where my E-commerce customer Amanda Kim lives", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Allentown" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Hoboken", + "New Jersey" + ] + } + } + ] + }, + "intent_template_id": 42 + }, + { + "sites": [ + "map" + ], + "task_id": 761, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Get directions from {{location/address_1}} to {{location/address_2}} using {{transportation}} options.", + "instantiation_dict": { + "location/address_1": "Carnegie Science Museum", + "location/address_2": "Hunt library CMU", + "transportation": "walk" + }, + "intent": "Get directions from Carnegie Science Museum to Hunt library CMU using walk options.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "2" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Science Center", + "Allegheny County", + "Pittsburgh" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Hunt Library", + "Pittsburgh" + ] + } + } + ] + }, + "intent_template_id": 54 + }, + { + "sites": [ + "map" + ], + "task_id": 762, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Get directions from {{location/address_1}} to {{location/address_2}} using {{transportation}} options.", + "instantiation_dict": { + "location/address_1": "Carnegie Music Hall in NYC", + "location/address_2": "Carnegie Mellon University", + "transportation": "driving" + }, + "intent": "Get directions from Carnegie Music Hall in NYC to Carnegie Mellon University using driving options.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "Carnegie Hall", + "West 57th Street", + "Manhattan", + "New York" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Carnegie Mellon University", + "Pittsburgh" + ] + } + } + ] + }, + "intent_template_id": 54 + }, + { + "sites": [ + "map" + ], + "task_id": 763, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the walkway to the closest {{store}} from {{location}}.", + "instantiation_dict": { + "store": "Trader Joe's", + "location": "401 Shady Ave, Pittsburgh" + }, + "intent": "Find the walkway to the closest Trader Joe's from 401 Shady Ave, Pittsburgh.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "2" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "401, Shady Avenue, Shadyside" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Trader Joe's, 6343, Penn Avenue, East Liberty" + ] + } + } + ] + }, + "intent_template_id": 75 + }, + { + "sites": [ + "map" + ], + "task_id": 764, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the walkway to the closest {{store}} from {{location}}.", + "instantiation_dict": { + "store": "Target", + "location": "401 Shady Ave, Pittsburgh" + }, + "intent": "Find the walkway to the closest Target from 401 Shady Ave, Pittsburgh.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "2" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "401, Shady Avenue, Shadyside" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Target, 6231, Penn Avenue, East Liberty" + ] + } + } + ] + }, + "intent_template_id": 75 + }, + { + "sites": [ + "map" + ], + "task_id": 765, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the walkway to the closest {{store}} from {{location}}.", + "instantiation_dict": { + "store": "Japanese food market", + "location": "401 Shady Ave, Pittsburgh" + }, + "intent": "Find the walkway to the closest Japanese food market from 401 Shady Ave, Pittsburgh.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "2" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "401, Shady Avenue, Shadyside" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Tokyo Japanese Food Store, 5855, Ellsworth Avenue, Shadyside" + ] + } + } + ] + }, + "intent_template_id": 75 + }, + { + "sites": [ + "map" + ], + "task_id": 766, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the walkway to the closest {{store}} from {{location}}.", + "instantiation_dict": { + "store": "grocessory owned by Amazon", + "location": "401 Shady Ave, Pittsburgh" + }, + "intent": "Find the walkway to the closest grocessory owned by Amazon from 401 Shady Ave, Pittsburgh.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "2" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "401, Shady Avenue, Shadyside" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Whole Foods Market, 5700, Penn Avenue, East Liberty" + ] + } + } + ] + }, + "intent_template_id": 75 + }, + { + "sites": [ + "map" + ], + "task_id": 767, + "require_login": true, + "storage_state": null, + "start_url": "__MAP__", + "geolocation": null, + "intent_template": "Find the walkway to the closest {{store}} from {{location}}.", + "instantiation_dict": { + "store": "chain grocessory owned by a local business", + "location": "401 Shady Ave, Pittsburgh" + }, + "intent": "Find the walkway to the closest chain grocessory owned by a local business from 401 Shady Ave, Pittsburgh.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector(\"div#content select.routing_engines\").selectedIndex", + "required_contents": { + "exact_match": "2" + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_from\"').value", + "required_contents": { + "must_include": [ + "401, Shady Avenue, Shadyside" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('[name=\"route_to\"').value", + "required_contents": { + "must_include": [ + "Giant Eagle, 5550, Centre Avenue, Shadyside" + ] + } + } + ] + }, + "intent_template_id": 75 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 768, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "{{quantity}} {{product}} arrived, update the stock", + "instantiation_dict": { + "quantity": "5", + "product": "blue Cronus yoga pants with size 33" + }, + "intent": "5 blue Cronus yoga pants with size 33 arrived, update the stock", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/872/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "5" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/872/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][is_in_stock]\"').value", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 241 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 769, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "We've received {{quantity}} {{product}}, please update the inventory.", + "instantiation_dict": { + "quantity": "378", + "product": "brown Aero daily fitness tee in every size" + }, + "intent": "We've received 378 brown Aero daily fitness tee in every size, please update the inventory.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/544/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "478" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/547/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "478" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/550/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "478" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/553/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "478" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/556/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "478" + } + } + ] + }, + "intent_template_id": 241 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 770, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "We've received {{quantity}}, update the inventory.", + "instantiation_dict": { + "quantity": "12 white Cora parachute pant of size 28 and 56 blue of size 29" + }, + "intent": "We've received 12 white Cora parachute pant of size 28 and 56 blue of size 29, update the inventory.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1836/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "112" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1838/", + "locator": "document.querySelector('[name=\"product[quantity_and_stock_status][qty]\"').value", + "required_contents": { + "exact_match": "156" + } + } + ] + }, + "intent_template_id": 241 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 771, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Approve the positive reviews to display in our store.", + "instantiation_dict": {}, + "intent": "Approve the positive reviews to display in our store.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/352", + "locator": "document.querySelector('[name=\"status_id\"').value", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/349", + "locator": "document.querySelector('[name=\"status_id\"').value", + "required_contents": { + "exact_match": "1" + } + }, + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/347", + "locator": "document.querySelector('[name=\"status_id\"').value", + "required_contents": { + "exact_match": "1" + } + } + ] + }, + "intent_template_id": 243 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 772, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Delete all {{review_type}}", + "instantiation_dict": { + "review_type": "pending negative reviews for Circe fleece" + }, + "intent": "Delete all pending negative reviews for Circe fleece", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/999", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + } + ] + }, + "intent_template_id": 246 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 773, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Delete all {{review_type}}", + "instantiation_dict": { + "review_type": "pending negative reviews" + }, + "intent": "Delete all pending negative reviews", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/351", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + }, + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/353", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + } + ] + }, + "intent_template_id": 246 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 774, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Delete all {{review_type}}", + "instantiation_dict": { + "review_type": "pending reviews with less than 4 stars" + }, + "intent": "Delete all pending reviews with less than 4 stars", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/351", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + }, + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/353", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + }, + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/349", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + } + ] + }, + "intent_template_id": 246 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 775, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Delete all {{review_type}}", + "instantiation_dict": { + "review_type": "reviews from the scammer Arden" + }, + "intent": "Delete all reviews from the scammer Arden", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/51", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + } + ] + }, + "intent_template_id": 246 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 776, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Delete all {{review_type}}", + "instantiation_dict": { + "review_type": "reviews from the scammer Carlo" + }, + "intent": "Delete all reviews from the scammer Carlo", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/93", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + }, + { + "url": "__SHOPPING_ADMIN__/review/product/edit/id/109", + "locator": "", + "required_contents": { + "must_include": [ + "Rating isn't Available" + ] + } + } + ] + }, + "intent_template_id": 246 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 777, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "{{action}} the price of {{config}} by {{amount}}", + "instantiation_dict": { + "amount": "$5", + "action": "Reduce", + "config": "green Hollister backyard sweater in all size" + }, + "intent": "Reduce the price of green Hollister backyard sweater in all size by $5", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/120/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "47.00" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/117/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "47.00" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/114/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "47.00" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/111/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "47.00" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/123/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "47.00" + } + } + ] + }, + "intent_template_id": 742 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 778, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "{{action}} the price of {{config}} by {{amount}}", + "instantiation_dict": { + "amount": "13.5%", + "action": "Reduce", + "config": "size 28 Sahara leggings" + }, + "intent": "Reduce the price of size 28 Sahara leggings by 13.5%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1841/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "64.88" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1842/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "64.88" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1843/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "64.88" + } + } + ] + }, + "intent_template_id": 742 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 779, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "{{action}} the price of {{config}} by {{amount}}", + "instantiation_dict": { + "amount": "15%", + "action": "Reduce", + "config": "yellow shirts from Gwyn Endurance in all size below L" + }, + "intent": "Reduce the price of yellow shirts from Gwyn Endurance in all size below L by 15%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1559/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "20.40" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1562/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "20.40" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1565/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "20.40" + } + } + ] + }, + "intent_template_id": 742 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 780, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1481/", + "geolocation": null, + "intent_template": "{{action}} the price of {{config}} by {{amount}}", + "instantiation_dict": { + "amount": "$17", + "action": "Increase", + "config": "white Ingrid Running with size L and above" + }, + "intent": "Increase the price of white Ingrid Running with size L and above by $17", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1264/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "64.00" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1267/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "64.00" + } + } + ] + }, + "intent_template_id": 742 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 781, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "{{action}} the price of {{config}} by {{amount}}", + "instantiation_dict": { + "amount": "37%", + "action": "Increase", + "config": "black fitness tshirts from Desiree with size XS" + }, + "intent": "Increase the price of black fitness tshirts from Desiree with size XS by 37%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/1573/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "32.88" + } + } + ] + }, + "intent_template_id": 742 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 782, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "{{action}} the price of {{config}} by {{amount}}", + "instantiation_dict": { + "amount": "23%", + "action": "Increase", + "config": "all blue running tshirts in extra small and small sizes" + }, + "intent": "Increase the price of all blue running tshirts in extra small and small sizes by 23%", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/496/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "22.33" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/499/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "22.33" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/479/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "21.56" + } + }, + { + "url": "__SHOPPING_ADMIN__/catalog/product/edit/id/482/", + "locator": "document.querySelector('[name=\"product[price]\"').value", + "required_contents": { + "exact_match": "21.56" + } + } + ] + }, + "intent_template_id": 742 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 783, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Add the following users to repo {{repo}} as {{role}}: {{user_list}}", + "instantiation_dict": { + "repo": "kkroening/ffmpeg-python", + "role": "maintainer", + "user_list": [ + "yjlou", + "a11yproject" + ] + }, + "intent": "Add the following users to repo kkroening/ffmpeg-python as maintainer: ['yjlou', 'a11yproject']", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "not the owner of the repo so cannot add maintainer", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 351 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 784, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/CellularPrivacy/Android-IMSI-Catcher-Detector", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the contributor who has the most commits to branch {{branch_name}}", + "instantiation_dict": { + "branch_name": "main", + "attribute": "email address" + }, + "intent": "Tell me the email address of the contributor who has the most commits to branch main", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "secupwn@users.noreply.github.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "secupwn@users.noreply.github.com" + }, + "intent_template_id": 316 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 785, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/CellularPrivacy/Android-IMSI-Catcher-Detector", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the contributor who has the most commits to branch {{branch_name}}", + "instantiation_dict": { + "branch_name": "gh-page", + "attribute": "email address" + }, + "intent": "Tell me the email address of the contributor who has the most commits to branch gh-page", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "secupwn@users.noreply.github.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "secupwn@users.noreply.github.com" + }, + "intent_template_id": 316 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 786, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/vinta/awesome-python", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the contributor who has the most commits to branch {{branch_name}}", + "instantiation_dict": { + "branch_name": "main", + "attribute": "number of commits" + }, + "intent": "Tell me the number of commits of the contributor who has the most commits to branch main", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "412" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "412" + }, + "intent_template_id": 316 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 787, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/dehenne/awesome-visibility/-/graphs/master", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the contributor who has the most commits to branch {{branch_name}}", + "instantiation_dict": { + "branch_name": "main", + "attribute": "number of followers" + }, + "intent": "Tell me the number of followers of the contributor who has the most commits to branch main", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "0" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "0" + }, + "intent_template_id": 316 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 788, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/amwhalen/archive-my-tweets/-/tree/github/fork/chtitux/addRssFeed", + "geolocation": null, + "intent_template": "Tell me the {{attribute}} of the contributor who has the most commits to branch {{branch_name}}", + "instantiation_dict": { + "branch_name": "php52", + "attribute": "full name, gitlab account name, location and email address" + }, + "intent": "Tell me the full name, gitlab account name, location and email address of the contributor who has the most commits to branch php52", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "must_include": [ + "Andrew M. Whalen", + "amwhalen", + "Massachusetts", + "github@amwhalen.com" + ] + }, + "reference_url": "", + "program_html": [], + "string_note": "", + "reference_answer_raw_annotation": "Andrew M. Whalen, amwhalen, Massachusetts, github@amwhalen.com" + }, + "intent_template_id": 316 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 789, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create an issue {{issue}} in {{repo}}.", + "instantiation_dict": { + "repo": "huggingface dataset", + "issue": "asking about do they have any plan on supporting Webagent in the next quater" + }, + "intent": "Create an issue asking about do they have any plan on supporting Webagent in the next quater in huggingface dataset.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "huggingface repo does not exist", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 328 + }, + { + "sites": [ + "shopping_admin" + ], + "task_id": 790, + "require_login": true, + "storage_state": "./.auth/shopping_admin_state.json", + "start_url": "__SHOPPING_ADMIN__", + "geolocation": null, + "intent_template": "Delete all {{review_type}}", + "instantiation_dict": { + "review_type": "negative reviews for Sybil running short" + }, + "intent": "Delete all negative reviews for Sybil running short", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "No negative reviews for sybil running short", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 246 + }, + { + "sites": [ + "gitlab", + "reddit" + ], + "task_id": 791, + "require_login": true, + "storage_state": "./.auth/gitlab.reddit_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Make a folder named {{directory}} on the {{gitlab_repo}} repo and include a file called urls.txt that consists of the links to the 5 most recent posts from {{subreddit}}.", + "instantiation_dict": { + "directory": "car", + "subreddit": "cars", + "gitlab_repo": "gimmiethat.space" + }, + "intent": "Make a folder named car on the gimmiethat.space repo and include a file called urls.txt that consists of the links to the 5 most recent posts from cars.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "the subreddit does not exist", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 84 + }, + { + "sites": [ + "shopping" + ], + "task_id": 792, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the highest rated product from the {{product_category}} category within a budget {{dollar_value}}.", + "instantiation_dict": { + "product_category": "Beauty & Personal Care", + "dollar_value": "under 20" + }, + "intent": "Buy the highest rated product from the Beauty & Personal Care category within a budget under 20.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The website does not support sorting by rating and there are too many products in this category", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 172 + }, + { + "sites": [ + "shopping" + ], + "task_id": 793, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Buy the highest rated product from the {{product_category}} category within a budget {{dollar_value}}.", + "instantiation_dict": { + "product_category": "Men clothing", + "dollar_value": "above 50 but under 129.99" + }, + "intent": "Buy the highest rated product from the Men clothing category within a budget above 50 but under 129.99.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The website does not support sorting by rating and there are too many products in this category", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 172 + }, + { + "sites": [ + "shopping" + ], + "task_id": 794, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Change the delivery address for my most recent order to {{address}}.", + "instantiation_dict": { + "address": "4000 Forbes Ave, Pittsburgh, PA" + }, + "intent": "Change the delivery address for my most recent order to 4000 Forbes Ave, Pittsburgh, PA.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The shipping address cannot be changed after an order is placed in the website.", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 191 + }, + { + "sites": [ + "shopping" + ], + "task_id": 795, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Change the delivery address for my most recent order to {{address}}.", + "instantiation_dict": { + "address": "6726 McPherson Blvd, Pittsburgh, PA" + }, + "intent": "Change the delivery address for my most recent order to 6726 McPherson Blvd, Pittsburgh, PA.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The shipping address cannot be changed after an order is placed in the website.", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 191 + }, + { + "sites": [ + "shopping" + ], + "task_id": 796, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Change the delivery address for my most recent order to {{address}}.", + "instantiation_dict": { + "address": "155 5th Street, San Francisco, CA" + }, + "intent": "Change the delivery address for my most recent order to 155 5th Street, San Francisco, CA.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The shipping address cannot be changed after an order is placed in the website.", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 191 + }, + { + "sites": [ + "shopping" + ], + "task_id": 797, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Change the delivery address for my most recent order to {{address}}.", + "instantiation_dict": { + "address": "3 Oxford St, Cambridge, MA" + }, + "intent": "Change the delivery address for my most recent order to 3 Oxford St, Cambridge, MA.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The shipping address cannot be changed after an order is placed in the website.", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 191 + }, + { + "sites": [ + "shopping" + ], + "task_id": 798, + "require_login": true, + "storage_state": "./.auth/shopping_state.json", + "start_url": "__SHOPPING__", + "geolocation": null, + "intent_template": "Change the delivery address for my most recent order to {{address}}.", + "instantiation_dict": { + "address": "77 Massachusetts Ave, Cambridge, MA" + }, + "intent": "Change the delivery address for my most recent order to 77 Massachusetts Ave, Cambridge, MA.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "N/A" + }, + "reference_url": "", + "program_html": [], + "string_note": "The shipping address cannot be changed after an order is placed in the website.", + "reference_answer_raw_annotation": "N/A" + }, + "intent_template_id": 191 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 799, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a new group \"{{name}}\" with members {{members}}", + "instantiation_dict": { + "name": "n-lab", + "members": "patou, egpast, westurner, jontutcher" + }, + "intent": "create a new group \"n-lab\" with members patou, egpast, westurner, jontutcher", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/groups/n-lab/-/group_members", + "locator": "", + "required_contents": { + "must_include": [ + "@patou", + "@egpast", + "@westurner", + "@jontutcher" + ] + } + } + ] + }, + "intent_template_id": 600 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 800, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a new group \"{{name}}\" with members {{members}}", + "instantiation_dict": { + "name": "x-lab", + "members": "JonasVautherin, dilipchandima, dawiss1337, bmyun, DCMJY" + }, + "intent": "create a new group \"x-lab\" with members JonasVautherin, dilipchandima, dawiss1337, bmyun, DCMJY", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/groups/x-lab/-/group_members", + "locator": "", + "required_contents": { + "must_include": [ + "@JonasVautherin", + "@dilipchandima", + "@dawiss1337", + "@bmyun", + "@DCMJY" + ] + } + } + ] + }, + "intent_template_id": 600 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 801, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a new group \"{{name}}\" with members {{members}}", + "instantiation_dict": { + "name": "crew", + "members": "ASWATFZLLC, patrickhlauke, westurner, linkmatrix" + }, + "intent": "create a new group \"crew\" with members ASWATFZLLC, patrickhlauke, westurner, linkmatrix", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/groups/crew/-/group_members", + "locator": "", + "required_contents": { + "must_include": [ + "@ASWATFZLLC", + "@patrickhlauke", + "@westurner", + "@linkmatrix" + ] + } + } + ] + }, + "intent_template_id": 600 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 802, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a new group \"{{name}}\" with members {{members}}", + "instantiation_dict": { + "name": "coding_friends", + "members": "qhduan, Agnes-U" + }, + "intent": "create a new group \"coding_friends\" with members qhduan, Agnes-U", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/groups/coding_friends/-/group_members", + "locator": "", + "required_contents": { + "must_include": [ + "@qhduan", + "@Agnes-U" + ] + } + } + ] + }, + "intent_template_id": 600 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 803, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "create a new group \"{{name}}\" with members {{members}}", + "instantiation_dict": { + "name": "webagent", + "members": "pandey2000, sayakpaul, sayakpaul" + }, + "intent": "create a new group \"webagent\" with members pandey2000, sayakpaul, sayakpaul", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/groups/webagent/-/group_members", + "locator": "", + "required_contents": { + "must_include": [ + "@pandey2000", + "@sayakpaul" + ] + } + } + ] + }, + "intent_template_id": 600 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 804, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Assign the issue regarding {{issue}} to {{account}}.", + "instantiation_dict": { + "issue": "flash alerts", + "account": "myself and primer" + }, + "intent": "Assign the issue regarding flash alerts to myself and primer.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/dashboard/issues?scope=all&state=opened&assignee_username=byteblaze", + "locator": "", + "required_contents": { + "must_include": [ + "Add documentation on using Flash alerts in dialog components", + "Clarify usage of flash alert" + ] + } + }, + { + "url": "__GITLAB__/dashboard/issues?scope=all&state=opened&assignee_username=primer", + "locator": "", + "required_contents": { + "must_include": [ + "Add documentation on using Flash alerts in dialog components", + "Clarify usage of flash alert" + ] + } + } + ] + }, + "intent_template_id": 999 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 805, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/a11yproject/a11yproject.com", + "geolocation": null, + "intent_template": "Submit a merge request for {{source_branch}} to be merged into {{target_branch}} branch, assign {{reviewer}} as the reviewer", + "instantiation_dict": { + "source_branch": "the branch that implements the support of template strings", + "target_branch": "master", + "reviewer": "myself and Roshan" + }, + "intent": "Submit a merge request for the branch that implements the support of template strings to be merged into master branch, assign myself and Roshan as the reviewer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests", + "program_html": [ + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[0].outerText", + "required_contents": { + "exact_match": "feature/replace-gulp" + } + }, + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[1].outerText", + "required_contents": { + "exact_match": "main" + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.reviewer').outerText", + "required_contents": { + "must_include": [ + "Byte Blaze", + "Roshan Jossy" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 335 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 806, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Submit a merge request for {{source_branch}} branch to be merged into {{target_branch}} branch, assign {{reviewer}} as the reviewer", + "instantiation_dict": { + "source_branch": "a11yproject.com/redesign", + "target_branch": "markdown-figure-block", + "reviewer": "myself" + }, + "intent": "Submit a merge request for a11yproject.com/redesign branch to be merged into markdown-figure-block branch, assign myself as the reviewer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/merge_requests", + "program_html": [ + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[0].outerText", + "required_contents": { + "exact_match": "redesign" + } + }, + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[1].outerText", + "required_contents": { + "exact_match": "feature/markdown-figure-block" + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.reviewer').outerText", + "required_contents": { + "must_include": [ + "Byte Blaze" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 335 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 807, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__/primer/design", + "geolocation": null, + "intent_template": "Submit a merge request for {{source_branch}} branch to be merged into {{target_branch}} branch, assign {{reviewer}} as the reviewer", + "instantiation_dict": { + "source_branch": "build time debug", + "target_branch": "main", + "reviewer": "myself" + }, + "intent": "Submit a merge request for build time debug branch to be merged into main branch, assign myself as the reviewer", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/primer/design/-/merge_requests", + "program_html": [ + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[1].outerText", + "required_contents": { + "exact_match": "main" + } + }, + { + "url": "last", + "locator": "document.querySelectorAll(\".detail-page-description > a.gl-font-monospace\")[0].outerText", + "required_contents": { + "exact_match": "debug-build-time" + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.reviewer').outerText", + "required_contents": { + "must_include": [ + "Byte Blaze" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 335 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 808, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create an issue in {{repo}} repo with title \"{{issue}}\". Assign the issue to {{account}}. Set due date to be {{due}}", + "instantiation_dict": { + "repo": "cloud-to-butt", + "issue": "Let's keep the project alive", + "account": "myself", + "due": "the end of Q1 2033" + }, + "intent": "Create an issue in cloud-to-butt repo with title \"Let's keep the project alive\". Assign the issue to myself. Set due date to be the end of Q1 2033", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/byteblaze/cloud-to-butt/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[data-qa-selector=\"title_content\"]').outerText", + "required_contents": { + "exact_match": "Let's keep the project alive" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-testid=\"sidebar-due-date\"').outerText", + "required_contents": { + "must_include": [ + "Mar 31, 2033" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.assignee').outerText", + "required_contents": { + "must_include": [ + "Byte Blaze" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 327 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 809, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Create an issue in {{repo}} repo with title \"{{issue}}\". Assign the issue to {{account}}. Set due date to be {{due}}", + "instantiation_dict": { + "repo": "a11yproject", + "issue": "404 for many URLs", + "account": "myself", + "due": "2030-1-3" + }, + "intent": "Create an issue in a11yproject repo with title \"404 for many URLs\". Assign the issue to myself. Set due date to be 2030-1-3", + "require_reset": false, + "eval": { + "eval_types": [ + "url_match", + "program_html" + ], + "reference_answers": null, + "reference_url": "__GITLAB__/a11yproject/a11yproject.com/-/issues", + "program_html": [ + { + "url": "last", + "locator": "document.querySelector('[data-qa-selector=\"title_content\"]').outerText", + "required_contents": { + "exact_match": "404 for many URLs" + } + }, + { + "url": "last", + "locator": "document.querySelector('[data-testid=\"sidebar-due-date\"').outerText", + "required_contents": { + "must_include": [ + "Jan 3, 2030" + ] + } + }, + { + "url": "last", + "locator": "document.querySelector('.block.assignee').outerText", + "required_contents": { + "must_include": [ + "Byte Blaze" + ] + } + } + ], + "url_note": "GOLD in PRED" + }, + "intent_template_id": 327 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 810, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Assign the issue regarding {{issue}} in {{repo}} repo to {{account}}.", + "instantiation_dict": { + "repo": "primer design guide", + "issue": "flash alert", + "account": "myself" + }, + "intent": "Assign the issue regarding flash alert in primer design guide repo to myself.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/dashboard/issues?scope=all&state=opened&assignee_username=byteblaze", + "locator": "", + "required_contents": { + "must_include": [ + "Add documentation on using Flash alerts in dialog components", + "Clarify usage of flash alert" + ] + } + } + ] + }, + "intent_template_id": 999 + }, + { + "sites": [ + "gitlab" + ], + "task_id": 811, + "require_login": true, + "storage_state": "./.auth/gitlab_state.json", + "start_url": "__GITLAB__", + "geolocation": null, + "intent_template": "Assign the issue regarding {{issue}} in {{repo}} to {{account}}.", + "instantiation_dict": { + "repo": "a11yproject", + "issue": 404, + "account": "myself" + }, + "intent": "Assign the issue regarding 404 in a11yproject to myself.", + "require_reset": false, + "eval": { + "eval_types": [ + "program_html" + ], + "reference_answers": null, + "reference_url": "", + "program_html": [ + { + "url": "__GITLAB__/dashboard/issues?scope=all&state=opened&assignee_username=byteblaze", + "locator": "", + "required_contents": { + "must_include": [ + "404s, bad host, timeouts, bad urls for URLs linked from website" + ] + } + } + ] + }, + "intent_template_id": 999 + } +] diff --git a/config_files/webvoyager/Allrecipes--10.json b/config_files/webvoyager/Allrecipes--10.json new file mode 100644 index 0000000..5a45e80 --- /dev/null +++ b/config_files/webvoyager/Allrecipes--10.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "allrecipes" + ], + "task_id": "Allrecipes--10", + "require_login": false, + "storage_state": null, + "start_url": "https://www.allrecipes.com/", + "geolocation": null, + "intent": "Find The Most Popular Recipes of the 1960s, noting the recipe name, preparation time and total time of the second recipe in this collection.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "'Swedish Meatballs I', prep time 25 mins, total time 1 hour 25 mins" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Allrecipes--17.json b/config_files/webvoyager/Allrecipes--17.json new file mode 100644 index 0000000..b285823 --- /dev/null +++ b/config_files/webvoyager/Allrecipes--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "allrecipes" + ], + "task_id": "Allrecipes--17", + "require_login": false, + "storage_state": null, + "start_url": "https://www.allrecipes.com/", + "geolocation": null, + "intent": "Find the Easy Vegetarian Spinach Lasagna recipe on Allrecipes and tell me what the latest review says.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Easy to make and very delicious" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Allrecipes--3.json b/config_files/webvoyager/Allrecipes--3.json new file mode 100644 index 0000000..239f858 --- /dev/null +++ b/config_files/webvoyager/Allrecipes--3.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "allrecipes" + ], + "task_id": "Allrecipes--3", + "require_login": false, + "storage_state": null, + "start_url": "https://www.allrecipes.com/", + "geolocation": null, + "intent": "Locate a recipe for vegan chocolate chip cookies with over 60 reviews and a rating of at least 4.5 stars on Allrecipes.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "'Vegan Chocolate Chip, Oatmeal, and Nut Cookies', 4.9 star, 67 viewers (> 60)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Allrecipes--40.json b/config_files/webvoyager/Allrecipes--40.json new file mode 100644 index 0000000..0da43c0 --- /dev/null +++ b/config_files/webvoyager/Allrecipes--40.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "allrecipes" + ], + "task_id": "Allrecipes--40", + "require_login": false, + "storage_state": null, + "start_url": "https://www.allrecipes.com/", + "geolocation": null, + "intent": "Browse the about us section of Allrecipes for a brief introduction to The Allrecipes Allstars.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "The Allrecipes Allstars: Social media influencers, registered dietitians, grillmasters, and more seasoned home cooks make up our enthusiastic squad of 100+ brand ambassadors. This diverse, food-loving crew spans the U.S. geographically and represents many different cultures, ethnicities, and family makeups. Since 2011, the Allstars have created tens of thousands of original recipes, photos, and reviews plus shared their cooking expertise via flat and video content on our website, social media, plus more marketing channels." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Amazon--16.json b/config_files/webvoyager/Amazon--16.json new file mode 100644 index 0000000..f5af174 --- /dev/null +++ b/config_files/webvoyager/Amazon--16.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "amazon" + ], + "task_id": "Amazon--16", + "require_login": false, + "storage_state": null, + "start_url": "https://www.amazon.com/", + "geolocation": null, + "intent": "Find the Return Policy for Mens Rhinestone Skull Graphic Shirt on Amazon. Color: Black, Size: XX-Large. If Free return is avaliable, tell me how to return this item.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "FREE Returns, 1. Go to Your Orders to start the return; 2. Print the return shipping label; 3. Ship it!" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--12.json b/config_files/webvoyager/Apple--12.json new file mode 100644 index 0000000..c264f58 --- /dev/null +++ b/config_files/webvoyager/Apple--12.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--12", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "What Apple Repair ways are mentioned on apple website, answer 2 of them.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Any 2 of 'Send your product to Apple', 'Find an Apple Authorized Service Provider', 'Visit a Genius at an Apple Store', 'Independent Repair Providers', 'Self Service Repair'" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--17.json b/config_files/webvoyager/Apple--17.json new file mode 100644 index 0000000..fe547b7 --- /dev/null +++ b/config_files/webvoyager/Apple--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--17", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "Search Apple for the accessory Smart Folio for iPad and check the closest pickup availability next to zip code 90038.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Apple Tower Theatre" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--18.json b/config_files/webvoyager/Apple--18.json new file mode 100644 index 0000000..aec6032 --- /dev/null +++ b/config_files/webvoyager/Apple--18.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--18", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "Check if there are trade-in offers for the latest model of iPhone.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "There are trade-in offers." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--19.json b/config_files/webvoyager/Apple--19.json new file mode 100644 index 0000000..4260ba7 --- /dev/null +++ b/config_files/webvoyager/Apple--19.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--19", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "On Apple's website, what is the slogan for the Mac and what is the slogan for the Macbook pro.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "If you can dream it, Mac can do it; Mind-blowing. Head-turning" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--28.json b/config_files/webvoyager/Apple--28.json new file mode 100644 index 0000000..21bfb6e --- /dev/null +++ b/config_files/webvoyager/Apple--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--28", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "On the Apple website, find out if the Mac Mini can be configured with a GPU larger than 16-core.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Yes. Mac mini Apple M2 Pro chip, Configurable to: 19-core GPU" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--31.json b/config_files/webvoyager/Apple--31.json new file mode 100644 index 0000000..e000a93 --- /dev/null +++ b/config_files/webvoyager/Apple--31.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--31", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "On Apple's website, what is the slogan for the latest Apple Watch Series.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Smarter. Brighter. Mightier." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Apple--37.json b/config_files/webvoyager/Apple--37.json new file mode 100644 index 0000000..6451dd6 --- /dev/null +++ b/config_files/webvoyager/Apple--37.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "apple" + ], + "task_id": "Apple--37", + "require_login": false, + "storage_state": null, + "start_url": "https://www.apple.com/", + "geolocation": null, + "intent": "Compare the color options of iPhone 13 Pro, iPhone 14 Pro and iPhone 15 Pro.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "iPhone 13 pro: Alpine Green, Silver, Gold, Graphite, Sierra Blue; iPhone 14 pro: Deep Purple, Gold, Silver, Space Black; iPhone 15 pro: Natural Titanium, Blue Titanium, White Titanium, Black Titanium" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--10.json b/config_files/webvoyager/ArXiv--10.json new file mode 100644 index 0000000..33f69f8 --- /dev/null +++ b/config_files/webvoyager/ArXiv--10.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--10", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Visit ArXiv Help on how to withdraw an article if the submission is not yet announced.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "If your submission has not yet become publicly available you may delete or delay it. To do either of these things go to your user page and select either the Delete or Unsubmit icon." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--11.json b/config_files/webvoyager/ArXiv--11.json new file mode 100644 index 0000000..a254ca4 --- /dev/null +++ b/config_files/webvoyager/ArXiv--11.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--11", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "For Non-English submissions, do I need to provide a multi-language abstract, if need, answer the separator between the multiple abstracts.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "-----" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--12.json b/config_files/webvoyager/ArXiv--12.json new file mode 100644 index 0000000..d8eec34 --- /dev/null +++ b/config_files/webvoyager/ArXiv--12.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--12", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Find store in arXiv Help, tell me how many styles of arXiv Logo Shirt are available?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "3" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--14.json b/config_files/webvoyager/ArXiv--14.json new file mode 100644 index 0000000..feb95db --- /dev/null +++ b/config_files/webvoyager/ArXiv--14.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--14", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "On ArXiv, how many articles have 'SimCSE' in the article and are originally announced in October 2023?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "3" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--17.json b/config_files/webvoyager/ArXiv--17.json new file mode 100644 index 0000000..35dff74 --- /dev/null +++ b/config_files/webvoyager/ArXiv--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--17", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Find the paper 'GPT-4 Technical Report', when was v3 submitted?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Mon, 27 Mar 2023 17:46:54 UTC" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--18.json b/config_files/webvoyager/ArXiv--18.json new file mode 100644 index 0000000..141a945 --- /dev/null +++ b/config_files/webvoyager/ArXiv--18.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--18", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Download the paper 'Dense Passage Retrieval for Open-Domain Question Answering'. How many formulas are in the article and which one is the loss function?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "2 formulas, the second one is loss function" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--25.json b/config_files/webvoyager/ArXiv--25.json new file mode 100644 index 0000000..f22b72f --- /dev/null +++ b/config_files/webvoyager/ArXiv--25.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--25", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Browse the ArXiv store and let me know how many different types of merchandise are available.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "6, arXiv Logo Shirt, arXiv Logo Mug, arXiv is Open Science, Gift cards, arXiv Morning Mug, arXiv Forever" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--27.json b/config_files/webvoyager/ArXiv--27.json new file mode 100644 index 0000000..536422d --- /dev/null +++ b/config_files/webvoyager/ArXiv--27.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--27", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "On ArXiv, what categories does Economics include, and what are their abbreviations?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Econometrics (econ.EM), General Economics (econ.GN), and Theoretical Economics (econ.TH)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--30.json b/config_files/webvoyager/ArXiv--30.json new file mode 100644 index 0000000..77366cf --- /dev/null +++ b/config_files/webvoyager/ArXiv--30.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--30", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Look up the submission guidelines on ArXiv for submitting a paper and tell me the formats for figures.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Accepted figure formats: PostScript (PS, EPS) \u2014 requires LaTeX processing; JPEG, GIF, PNG or PDF figures \u2014 requires PDFLaTeX processing" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--31.json b/config_files/webvoyager/ArXiv--31.json new file mode 100644 index 0000000..401d9b6 --- /dev/null +++ b/config_files/webvoyager/ArXiv--31.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--31", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Search ArXiv for papers with 'Graph Neural Networks' in the abstract that were submitted between Jan 1, 2024, and Jan 3, 2024, and determine how many of these papers have more than five authors.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "7 papers" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--36.json b/config_files/webvoyager/ArXiv--36.json new file mode 100644 index 0000000..d62b32f --- /dev/null +++ b/config_files/webvoyager/ArXiv--36.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--36", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Search 'CVPR 2023' and 'CVPR2023' through journal ref on ArXiv to see how many results there are respectively.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "'CVPR 2023': 48 results; 'CVPR2023': 9 results" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--37.json b/config_files/webvoyager/ArXiv--37.json new file mode 100644 index 0000000..687cc97 --- /dev/null +++ b/config_files/webvoyager/ArXiv--37.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--37", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Find the names of people in ArXiv's Leadership Team.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Ramin Zabih, Yoav Artzi, Stephanie Orphan, Steinn Sigurdsson, and Charles Frankston." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--39.json b/config_files/webvoyager/ArXiv--39.json new file mode 100644 index 0000000..af7de6b --- /dev/null +++ b/config_files/webvoyager/ArXiv--39.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--39", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Search the title 'GPT-4 Technical Report' and access this paper through HTML format. Read the paper on this page and tell me what is 'one of the main goals of developing such models' mentioned in the Introduction.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "One of the main goals of developing such models is to improve their ability to understand and generate natural language text, particularly in more complex and nuanced scenarios." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--41.json b/config_files/webvoyager/ArXiv--41.json new file mode 100644 index 0000000..0e86f05 --- /dev/null +++ b/config_files/webvoyager/ArXiv--41.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--41", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Find the button to share arxiv non-profit store and follow the QR code to share the shop. Then add arXiv Forever short sleeve (XL) to your cart.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "QR code image, Action: add to chart" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--42.json b/config_files/webvoyager/ArXiv--42.json new file mode 100644 index 0000000..2d82cd0 --- /dev/null +++ b/config_files/webvoyager/ArXiv--42.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--42", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "Find an article published between 1 January 2000 and 1 January 2005 that requires Support Vector Machines in the title and its Journey ref is ACL Workshop.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "'Using a Support-Vector Machine for Japanese-to-English Translation of Tense, Aspect, and Modality'" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ArXiv--6.json b/config_files/webvoyager/ArXiv--6.json new file mode 100644 index 0000000..74ae28e --- /dev/null +++ b/config_files/webvoyager/ArXiv--6.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "arxiv" + ], + "task_id": "ArXiv--6", + "require_login": false, + "storage_state": null, + "start_url": "https://arxiv.org/", + "geolocation": null, + "intent": "How many figures and tables are in the paper \"On the Sentence Embeddings from Pre-trained Language Models\"?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "2 Figures, 8 Tables." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/BBC News--28.json b/config_files/webvoyager/BBC News--28.json new file mode 100644 index 0000000..2943dc3 --- /dev/null +++ b/config_files/webvoyager/BBC News--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "bbc news" + ], + "task_id": "BBC News--28", + "require_login": false, + "storage_state": null, + "start_url": "https://www.bbc.com/news/", + "geolocation": null, + "intent": "Find the Market Data section on BBC News and tell me which company the data comes from.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Business - Market Data, Source: Morningstar" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/BBC News--5.json b/config_files/webvoyager/BBC News--5.json new file mode 100644 index 0000000..c45f372 --- /dev/null +++ b/config_files/webvoyager/BBC News--5.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "bbc news" + ], + "task_id": "BBC News--5", + "require_login": false, + "storage_state": null, + "start_url": "https://www.bbc.com/news/", + "geolocation": null, + "intent": "Find the article \"What is climate change? A really simple guide\" and use it to answer what human activities are causing climate change.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "This recent climate change has been caused by human activity, mainly the widespread use of fossil fuels - coal, oil and gas - in homes, factories and transport." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Booking--33.json b/config_files/webvoyager/Booking--33.json new file mode 100644 index 0000000..1cfad51 --- /dev/null +++ b/config_files/webvoyager/Booking--33.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "booking" + ], + "task_id": "Booking--33", + "require_login": false, + "storage_state": null, + "start_url": "https://www.booking.com/", + "geolocation": null, + "intent": "Find the Customer Service on the Booking website, browse the questions about cancellation, and tell me 'how do I know whether my booking has been cancelled'.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "After you cancel a booking with us, you should get an email confirming the cancellation. Make sure to check your inbox and spam/junk mail folders. If you don\u2019t receive an email within 24 hours, contact the property to confirm they got your cancellation." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Booking--41.json b/config_files/webvoyager/Booking--41.json new file mode 100644 index 0000000..da9c2c9 --- /dev/null +++ b/config_files/webvoyager/Booking--41.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "booking" + ], + "task_id": "Booking--41", + "require_login": false, + "storage_state": null, + "start_url": "https://www.booking.com/", + "geolocation": null, + "intent": "Browse Booking's homepage to find out which company it belongs to.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Booking Holdings Inc." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--0.json b/config_files/webvoyager/Cambridge Dictionary--0.json new file mode 100644 index 0000000..b47f223 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--0.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--0", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Look up the pronunciation and definition of the word \"sustainability\" on the Cambridge Dictionary.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "UK: /s\u0259\u02ccste\u026a.n\u0259\u02c8b\u026al.\u0259.ti/, US: /s\u0259\u02ccste\u026a.n\u0259\u02c8b\u026al.\u0259.t\u032ci/; the quality of being able to continue over a period of time" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--17.json b/config_files/webvoyager/Cambridge Dictionary--17.json new file mode 100644 index 0000000..efb956c --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--17", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "How many meanings of \"unblemished\" are given in Cambridge Dictionary? Please browse the page and give the number directly.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "2" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--18.json b/config_files/webvoyager/Cambridge Dictionary--18.json new file mode 100644 index 0000000..5517418 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--18.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--18", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Search for \"to behave well\" in Cambridge Dictionary's Thesaurus and see which synonyms the dictionary gives.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "behaves themselves; be on their best behaviour" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--19.json b/config_files/webvoyager/Cambridge Dictionary--19.json new file mode 100644 index 0000000..4957f78 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--19.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--19", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Try a Cambridge Dictionary translation and tell me which company provided the translation.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Microsoft" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--21.json b/config_files/webvoyager/Cambridge Dictionary--21.json new file mode 100644 index 0000000..c0fa182 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--21.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--21", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Search for the word \"ephemeral\" on Cambridge Dictionary and find its translation into Spanish.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "ef\u00edmero" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--26.json b/config_files/webvoyager/Cambridge Dictionary--26.json new file mode 100644 index 0000000..c4c535e --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--26.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--26", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Search for the word \"nostalgia\" in the Cambridge Dictionary and report the translation of this word into Chinese.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "\u6000\u65e7" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--28.json b/config_files/webvoyager/Cambridge Dictionary--28.json new file mode 100644 index 0000000..420fcb4 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--28", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Search for \"feel giddy\" in Cambridge Dictionary's Thesaurus and list the synonyms the dictionary provides.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Synonyms: feel dizzy; whirl; spin; reel" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--42.json b/config_files/webvoyager/Cambridge Dictionary--42.json new file mode 100644 index 0000000..ea8e246 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--42.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--42", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Convert the Cambridge Dictionary homepage from English (UK) to Deutsch.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Action: Click English (UK), change language to: Deutsch" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Cambridge Dictionary--6.json b/config_files/webvoyager/Cambridge Dictionary--6.json new file mode 100644 index 0000000..acda793 --- /dev/null +++ b/config_files/webvoyager/Cambridge Dictionary--6.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "cambridge dictionary" + ], + "task_id": "Cambridge Dictionary--6", + "require_login": false, + "storage_state": null, + "start_url": "https://dictionary.cambridge.org/", + "geolocation": null, + "intent": "Search for the word \"sustainability\" on the Cambridge Dictionary, what is the translation of sustainability into Chinese and French in the dictionary.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "\u53ef\u6301\u7eed\u6027; durabilit\u00e9 , viabilit\u00e9" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Coursera--38.json b/config_files/webvoyager/Coursera--38.json new file mode 100644 index 0000000..011fe6d --- /dev/null +++ b/config_files/webvoyager/Coursera--38.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "coursera" + ], + "task_id": "Coursera--38", + "require_login": false, + "storage_state": null, + "start_url": "https://www.coursera.org/", + "geolocation": null, + "intent": "Browse Coursera, which universities and companies from Australia are partners of Coursera? List all of them.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Macquarie University; The University of Melbourne; The University of Sydney; University of Western Australia; UNSW Sydney (The University of New South Wales)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Coursera--39.json b/config_files/webvoyager/Coursera--39.json new file mode 100644 index 0000000..258a25c --- /dev/null +++ b/config_files/webvoyager/Coursera--39.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "coursera" + ], + "task_id": "Coursera--39", + "require_login": false, + "storage_state": null, + "start_url": "https://www.coursera.org/", + "geolocation": null, + "intent": "Find the Space Safety course offered by TUM on Coursera. How many videos are there in module 2? What is the name of each video?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "6 videos; Introduction; Space Debris; Mitigation; Measurements; Protection; Atmospheric Re-entry" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--11.json b/config_files/webvoyager/ESPN--11.json new file mode 100644 index 0000000..8829029 --- /dev/null +++ b/config_files/webvoyager/ESPN--11.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--11", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "How many NBA teams are there and list all the teams with 'New' in their name.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "30; New York Knicks; New Orleans Pelicans" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--15.json b/config_files/webvoyager/ESPN--15.json new file mode 100644 index 0000000..2078672 --- /dev/null +++ b/config_files/webvoyager/ESPN--15.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--15", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Check the scores of the NBA games played on December 25, 2023.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "(US Time) Bucks vs Knicks, 122 - 129; Warriors vs Nuggets, 114 - 120; Celtics vs Lakers, 126 - 115; 76ers vs Heat, 113 - 119; Mavericks vs Suns, 128 - 114" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--17.json b/config_files/webvoyager/ESPN--17.json new file mode 100644 index 0000000..05a7d1d --- /dev/null +++ b/config_files/webvoyager/ESPN--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--17", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Check out the NBA Basketball Power Index 2023-24 to see which teams are in first place and which are in last place.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Boston Celtics; San Antonio Spurs" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--18.json b/config_files/webvoyager/ESPN--18.json new file mode 100644 index 0000000..4170f69 --- /dev/null +++ b/config_files/webvoyager/ESPN--18.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--18", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "How many sports leagues can you choose from on the ESPN home page?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "31 (in ESPN America)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--19.json b/config_files/webvoyager/ESPN--19.json new file mode 100644 index 0000000..d9f961f --- /dev/null +++ b/config_files/webvoyager/ESPN--19.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--19", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Who has the highest salary in Boston Celtics Roster 2023-24?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Jrue Holiday" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--27.json b/config_files/webvoyager/ESPN--27.json new file mode 100644 index 0000000..70e7ee9 --- /dev/null +++ b/config_files/webvoyager/ESPN--27.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--27", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Search on ESPN for how many teams have 'Golden' in their name and how many of them are in the NHL.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "30 teams in search results, 1 team Vegas Golden Knights (NHL)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--28.json b/config_files/webvoyager/ESPN--28.json new file mode 100644 index 0000000..717cc42 --- /dev/null +++ b/config_files/webvoyager/ESPN--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--28", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "How many MLB teams are there and list all the teams with 'City' in their name.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "30 teams in search results, Kansas City Royals" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--31.json b/config_files/webvoyager/ESPN--31.json new file mode 100644 index 0000000..a32b282 --- /dev/null +++ b/config_files/webvoyager/ESPN--31.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--31", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Who has the heaviest weight among infielders in the New York Yankees Roster 2023-24?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Carlos Rodon, 255 lbs" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--41.json b/config_files/webvoyager/ESPN--41.json new file mode 100644 index 0000000..6f5686e --- /dev/null +++ b/config_files/webvoyager/ESPN--41.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--41", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Find out which four teams the NFC North contains in the NFL on ESPN.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Chicago Bears, Detroit Lions, Green Bay Packers, and Minnesota Vikings" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/ESPN--9.json b/config_files/webvoyager/ESPN--9.json new file mode 100644 index 0000000..6139efd --- /dev/null +++ b/config_files/webvoyager/ESPN--9.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "espn" + ], + "task_id": "ESPN--9", + "require_login": false, + "storage_state": null, + "start_url": "https://www.espn.com/", + "geolocation": null, + "intent": "Search on ESPN for how many teams have Los Angeles in their name and how many of them are NBA.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "10 teams have Los Angeles in their name; 2 teams are NBA" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--1.json b/config_files/webvoyager/Google Map--1.json new file mode 100644 index 0000000..c0f1849 --- /dev/null +++ b/config_files/webvoyager/Google Map--1.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--1", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Tell me one bus stop that is nearest to the intersection of main street and Amherst street in Altavista.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "'Amherst and 7th' or 'Main Street Middle'" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--21.json b/config_files/webvoyager/Google Map--21.json new file mode 100644 index 0000000..690d8cd --- /dev/null +++ b/config_files/webvoyager/Google Map--21.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--21", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Identify the nearest bus stop to the corner of Elm Street and Oak Street in Massachusetts.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Elm Street & Oak Street, 18 Bay St, Amesbury, MA 01913" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--26.json b/config_files/webvoyager/Google Map--26.json new file mode 100644 index 0000000..ab2a15c --- /dev/null +++ b/config_files/webvoyager/Google Map--26.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--26", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Search for Los Angeles on Google Map, try to print the map as PDF and summarize the information on the map.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": ", print PDF" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--28.json b/config_files/webvoyager/Google Map--28.json new file mode 100644 index 0000000..3a8546c --- /dev/null +++ b/config_files/webvoyager/Google Map--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--28", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Find the search settings for Google Map, what options are shown on that page?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Privacy & Safety: Activity, Content, More options; Other settings" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--31.json b/config_files/webvoyager/Google Map--31.json new file mode 100644 index 0000000..077bb55 --- /dev/null +++ b/config_files/webvoyager/Google Map--31.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--31", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "First search New York's Central Park Zoo on Google Map, and then find the way to share the map. What is the generated sharing link?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "share link, https://maps.app.goo.gl/Bnp4Q67dTHoFZ4Lx8" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--33.json b/config_files/webvoyager/Google Map--33.json new file mode 100644 index 0000000..b2a6f43 --- /dev/null +++ b/config_files/webvoyager/Google Map--33.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--33", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Check out Denver International Airport's information and tell me: 1) which level has the least proportion in reviews; 2) what are its Accessibility and Amenities.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "star 2 has the least proportion; Accessibility: Assistive hearing loop; Wheelchair accessible entrance; Wheelchair accessible parking lot; Wheelchair accessible restroom; Wheelchair accessible seating; Amenities: Baggage storage; Wi-Fi; Free Wi-Fi" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--7.json b/config_files/webvoyager/Google Map--7.json new file mode 100644 index 0000000..8f97c65 --- /dev/null +++ b/config_files/webvoyager/Google Map--7.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--7", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Find bus stops in Alanson, MI", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Alanson, MI (EZ-Mart) Bus Stop" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--8.json b/config_files/webvoyager/Google Map--8.json new file mode 100644 index 0000000..0a9e746 --- /dev/null +++ b/config_files/webvoyager/Google Map--8.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--8", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Find a place to climb within 2 miles of zip code 90028.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Hollywood Boulders" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Map--9.json b/config_files/webvoyager/Google Map--9.json new file mode 100644 index 0000000..89ffec7 --- /dev/null +++ b/config_files/webvoyager/Google Map--9.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google map" + ], + "task_id": "Google Map--9", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/maps/", + "geolocation": null, + "intent": "Find the art gallery that is nearest to Los Angeles Hindu Temple.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "'Honor Fraser Gallery' or 'Walter Maciel Gallery'." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--0.json b/config_files/webvoyager/Google Search--0.json new file mode 100644 index 0000000..dbe8dbc --- /dev/null +++ b/config_files/webvoyager/Google Search--0.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--0", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Find the initial release date for Guardians of the Galaxy Vol. 3 the movie.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "May 5, 2023" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--12.json b/config_files/webvoyager/Google Search--12.json new file mode 100644 index 0000000..7a90515 --- /dev/null +++ b/config_files/webvoyager/Google Search--12.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--12", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Find the year that Tom Brady had the most touchdowns in a single seasson.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "2007" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--14.json b/config_files/webvoyager/Google Search--14.json new file mode 100644 index 0000000..5c0da8c --- /dev/null +++ b/config_files/webvoyager/Google Search--14.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--14", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Find the retired players the year before last named James Smith and tell me which club he has been a member of from 2020\u20132021.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Yeovil Town" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--15.json b/config_files/webvoyager/Google Search--15.json new file mode 100644 index 0000000..40917e6 --- /dev/null +++ b/config_files/webvoyager/Google Search--15.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--15", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Please try to log in to twitter with email: webagenttest@testmail.com and password: test123456. Let me know if the login was successful.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Not successful" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--17.json b/config_files/webvoyager/Google Search--17.json new file mode 100644 index 0000000..513cfc2 --- /dev/null +++ b/config_files/webvoyager/Google Search--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--17", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Tell me the names of Trump's kids", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Ivanka Trump, Barron Trump, Donald Trump Jr., Tiffany Trump, Eric Trump" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--18.json b/config_files/webvoyager/Google Search--18.json new file mode 100644 index 0000000..ad95b8c --- /dev/null +++ b/config_files/webvoyager/Google Search--18.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--18", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "When and where the most recent World Cup was held, and which team was the winner?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Qatar; November 20 to December 18, 2022; Argentina" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--19.json b/config_files/webvoyager/Google Search--19.json new file mode 100644 index 0000000..9b7f051 --- /dev/null +++ b/config_files/webvoyager/Google Search--19.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--19", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "What are the first 7 bits of the SHA of the Bert's latest commit on GitHub, and what exactly was changed in that commit.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "eedf571, Smaller BERT Models" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--20.json b/config_files/webvoyager/Google Search--20.json new file mode 100644 index 0000000..3140dc1 --- /dev/null +++ b/config_files/webvoyager/Google Search--20.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--20", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Find the release date for the latest \"Fast & Furious\" movie.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "April 4, 2025" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--21.json b/config_files/webvoyager/Google Search--21.json new file mode 100644 index 0000000..fcc7bca --- /dev/null +++ b/config_files/webvoyager/Google Search--21.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--21", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Show a list of the top 5 highest-grossing animated movies, sorted by box office earnings.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "The Lion King (2019); Frozen II (2019); The Super Mario Bros. Movie (2023); Frozen (2013); Incredibles 2 (2018)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--24.json b/config_files/webvoyager/Google Search--24.json new file mode 100644 index 0000000..30fd53e --- /dev/null +++ b/config_files/webvoyager/Google Search--24.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--24", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "What is the name of the star system closest to the Solar System, and what are the discovered planets in it?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Alpha Centauri star system; Proxima Centauri b, Proxima Centauri c, and Proxima Centauri d" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--28.json b/config_files/webvoyager/Google Search--28.json new file mode 100644 index 0000000..dc0f1c4 --- /dev/null +++ b/config_files/webvoyager/Google Search--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--28", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Check the IMDb and Metacritic scores of the movie \"Inception.\"", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "IMDb score 8.8, Metacritic score 74%." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--29.json b/config_files/webvoyager/Google Search--29.json new file mode 100644 index 0000000..7420b32 --- /dev/null +++ b/config_files/webvoyager/Google Search--29.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--29", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Find out the current world record for the men's 100m sprint.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "9.58s held by Usain Bolt of Jamaica" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--3.json b/config_files/webvoyager/Google Search--3.json new file mode 100644 index 0000000..bec9c97 --- /dev/null +++ b/config_files/webvoyager/Google Search--3.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--3", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Show me a list of comedy movies, sorted by user ratings. Show me the Top 5 movies.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Life Is Beautiful, Back to the Future, The Intouchables, City Lights, Modern Times" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--31.json b/config_files/webvoyager/Google Search--31.json new file mode 100644 index 0000000..1888ae4 --- /dev/null +++ b/config_files/webvoyager/Google Search--31.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--31", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Discover which year Cristiano Ronaldo scored the most goals in a single season.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "2014-15 season" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--40.json b/config_files/webvoyager/Google Search--40.json new file mode 100644 index 0000000..13eed28 --- /dev/null +++ b/config_files/webvoyager/Google Search--40.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--40", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Look up the elevation of Mount Kilimanjaro on Google Search.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "19,341 feet (5,895 meters)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Google Search--7.json b/config_files/webvoyager/Google Search--7.json new file mode 100644 index 0000000..c12e8c3 --- /dev/null +++ b/config_files/webvoyager/Google Search--7.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "google search" + ], + "task_id": "Google Search--7", + "require_login": false, + "storage_state": null, + "start_url": "https://www.google.com/", + "geolocation": null, + "intent": "Find the software requirements for iPhones that support AirDrop's ability to continue transmitting over the web when out of range.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "IOS 17.1" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--10.json b/config_files/webvoyager/Huggingface--10.json new file mode 100644 index 0000000..b87f307 --- /dev/null +++ b/config_files/webvoyager/Huggingface--10.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--10", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Open space: argilla/notux-chat-ui and interact with it by asking it 'which team trained you'. What is its answer.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Mistral AI team" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--13.json b/config_files/webvoyager/Huggingface--13.json new file mode 100644 index 0000000..cd9e46e --- /dev/null +++ b/config_files/webvoyager/Huggingface--13.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--13", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Search for LLaMA in the huggingface doc, what type is the spaces_between_special_tokens parameter in LlamaTokenizer and what is its default value.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "bool, defaults to False" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--14.json b/config_files/webvoyager/Huggingface--14.json new file mode 100644 index 0000000..1e04cd0 --- /dev/null +++ b/config_files/webvoyager/Huggingface--14.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--14", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "How much is the Pro account of Hugging face for a month and what are the features?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "$9/month; Pro Account: Get a PRO badge on your profile, Early access to new features, Unlock Inference for PROs, Higher tier for AutoTrain" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--18.json b/config_files/webvoyager/Huggingface--18.json new file mode 100644 index 0000000..41ff700 --- /dev/null +++ b/config_files/webvoyager/Huggingface--18.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--18", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Look up TRL's forward modelling in the hugging face documentation on how to add a margin to a loss.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "As in the Llama 2 paper, you can add a margin to the loss by adding a margin column to the dataset. The reward collator will automatically pass it through and the loss will be computed accordingly." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--20.json b/config_files/webvoyager/Huggingface--20.json new file mode 100644 index 0000000..b5746af --- /dev/null +++ b/config_files/webvoyager/Huggingface--20.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--20", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Locate a pre-trained natural language processing model on Hugging Face that specializes in named entity recognition (NER), confirm that the model was last updated in 2022 and has 1M+ downloads.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "ckiplab/bert-base-chinese-ner" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--21.json b/config_files/webvoyager/Huggingface--21.json new file mode 100644 index 0000000..76a184f --- /dev/null +++ b/config_files/webvoyager/Huggingface--21.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--21", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Look up the tour about how to use the 'pipeline' feature in the Hugging Face Transformers library for sentiment analysis, and identify the default model it uses.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "from transformers import pipeline \\n classifier = pipeline(\"sentiment-analysis\") \\n classifier(\"We are very happy to show you the \ud83e\udd17 Transformers library.\") ... distilbert/distilbert-base-uncased-finetuned-sst-2-english" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--24.json b/config_files/webvoyager/Huggingface--24.json new file mode 100644 index 0000000..2725db2 --- /dev/null +++ b/config_files/webvoyager/Huggingface--24.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--24", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Search for a model on Hugging Face with an Apache-2.0 license that has received the highest number of likes.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "mistralai/Mixtral-8x7B-Instruct-v0.1" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--25.json b/config_files/webvoyager/Huggingface--25.json new file mode 100644 index 0000000..3cfc13c --- /dev/null +++ b/config_files/webvoyager/Huggingface--25.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--25", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "In the Hugging Face documentation, find the tutorial on loading adapters with PEFT, tell me how to load in 8bit or 4bit.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Add the load_in_8bit or load_in_4bit parameters to from_pretrained() and set device_map=\"auto\" to effectively distribute the model to your hardware. (Or use code)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--27.json b/config_files/webvoyager/Huggingface--27.json new file mode 100644 index 0000000..4f49e22 --- /dev/null +++ b/config_files/webvoyager/Huggingface--27.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--27", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Determine the most downloaded dataset related to Text Retrieval in NLP on Hugging Face.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "nlphuji/mscoco_2014_5k_test_image_text_retrieval" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--30.json b/config_files/webvoyager/Huggingface--30.json new file mode 100644 index 0000000..936314f --- /dev/null +++ b/config_files/webvoyager/Huggingface--30.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--30", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Identify the most downloaded English-Chinese (en-zh) machine translation model on Huggingface and report its latest performance metrics and usage guidelines.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Helsinki-NLP/opus-mt-en-zh; testset, BLEU, chr-F: Tatoeba-test.eng.zho, 31.4, 0.268" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--32.json b/config_files/webvoyager/Huggingface--32.json new file mode 100644 index 0000000..decbe9c --- /dev/null +++ b/config_files/webvoyager/Huggingface--32.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--32", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "On the Hugging Face website, search for the model 'GPT-J-6B' and find the 'temperature' parameter in its settings. What is the default value of this parameter?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "\"temperature\": 1.0" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--38.json b/config_files/webvoyager/Huggingface--38.json new file mode 100644 index 0000000..c977849 --- /dev/null +++ b/config_files/webvoyager/Huggingface--38.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--38", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Investigate the 'transformers' library in the Hugging Face documentation, focusing on how to add new tokens to a tokenizer.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "use add_tokens method" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--41.json b/config_files/webvoyager/Huggingface--41.json new file mode 100644 index 0000000..b70eddc --- /dev/null +++ b/config_files/webvoyager/Huggingface--41.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--41", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "What is the current Text-to-3D model with the highest number of downloads and tell me are there Spaces that use the model.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "openai/shap-e; there are Spaces like hysts/Shap-E ..." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--42.json b/config_files/webvoyager/Huggingface--42.json new file mode 100644 index 0000000..26d93e9 --- /dev/null +++ b/config_files/webvoyager/Huggingface--42.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--42", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Check the Dataset Viewer for ai2lumos/lumos_complex_qa_plan_onetime on Hugging face. what is the content corresponding to user in the first message?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "content: Please provide a reasonable subgoal-based plan to solve the given task.\\nTask: What was the opening date of the museum dedicated to the war that, after it occurred, Boston became one of the wealthiest international ports?; Initial Environment Description: None." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--6.json b/config_files/webvoyager/Huggingface--6.json new file mode 100644 index 0000000..7f0cde9 --- /dev/null +++ b/config_files/webvoyager/Huggingface--6.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--6", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Find the model sentence-transformers/all-MiniLM-L6-v2 and use the Inference API on the webpage to get the similarity of the following two sentences: 'Tomorrow is Sunday', 'Eat a burger on Sunday'.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "0.550" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--7.json b/config_files/webvoyager/Huggingface--7.json new file mode 100644 index 0000000..2bcb721 --- /dev/null +++ b/config_files/webvoyager/Huggingface--7.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--7", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Which is the most downloaded audio related dataset on Hugging face currently.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "autumnjohnson/ceti_audio" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Huggingface--9.json b/config_files/webvoyager/Huggingface--9.json new file mode 100644 index 0000000..124fea2 --- /dev/null +++ b/config_files/webvoyager/Huggingface--9.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "huggingface" + ], + "task_id": "Huggingface--9", + "require_login": false, + "storage_state": null, + "start_url": "https://huggingface.co/", + "geolocation": null, + "intent": "Find the most download machine translation model on Huggingface which focuses on English and Japanese (en-ja) and report the evaluation metrics stated for it.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Helsinki-NLP/opus-mt-ja-en; BLEU 41.7\t; chr-F 0.589" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--0.json b/config_files/webvoyager/Wolfram Alpha--0.json new file mode 100644 index 0000000..cb686ed --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--0.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--0", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "derivative of x^2 when x=5.6", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "11.2" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--10.json b/config_files/webvoyager/Wolfram Alpha--10.json new file mode 100644 index 0000000..cf66c84 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--10.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--10", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Give the geomagnetic field on June 20, 2023 in Oslo.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "geomagnetic field, total 51.5 uT;" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--11.json b/config_files/webvoyager/Wolfram Alpha--11.json new file mode 100644 index 0000000..8d15b24 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--11.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--11", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Show the electrical resistivity of UNS A92024 and UNS G10800 at 20 degrees Celsius.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "UNS A92024: 4.9\u00d710^-6 \u03a9 cm (ohm centimeters) (at 20 \u00b0C); UNS G10800: 1.8\u00d710^-5 \u03a9 cm (ohm centimeters)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--12.json b/config_files/webvoyager/Wolfram Alpha--12.json new file mode 100644 index 0000000..4a5d642 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--12.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--12", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Which character in unicode 8900 to 8920 looks like a snowflake", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "8902 (U+22C6)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--15.json b/config_files/webvoyager/Wolfram Alpha--15.json new file mode 100644 index 0000000..ddd3a6f --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--15.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--15", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Show the blood relationship fraction between you and your father's mother's sister's son.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "3.125%" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--17.json b/config_files/webvoyager/Wolfram Alpha--17.json new file mode 100644 index 0000000..c984595 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--17.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--17", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Show the average price of movie ticket in Providence, Nashville, Boise in 2023.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Providence $13.81; Nashville $12.65; Boise $12.65" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--2.json b/config_files/webvoyager/Wolfram Alpha--2.json new file mode 100644 index 0000000..fb94bf3 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--2.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--2", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Calculate 3^71 and retain 5 significant figures in scientific notation.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "7.5095 * 10^33" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--20.json b/config_files/webvoyager/Wolfram Alpha--20.json new file mode 100644 index 0000000..8992334 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--20.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--20", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Compute the integral of 3e^(2x) from x=0 to x=5.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "approximately 33038" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--21.json b/config_files/webvoyager/Wolfram Alpha--21.json new file mode 100644 index 0000000..29d6028 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--21.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--21", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Calculate (1+0.1*i)^8 + (1\u22120.2*i)^8 where i is a complex number.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "approximately 0.717183 - 0.425258 i" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--22.json b/config_files/webvoyager/Wolfram Alpha--22.json new file mode 100644 index 0000000..f480aa6 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--22.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--22", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Determine the area of a regular hexagon with a side length of 7 cm.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "127.306 cm^2 or 147 \\sqrt(3) / 2" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--23.json b/config_files/webvoyager/Wolfram Alpha--23.json new file mode 100644 index 0000000..ddd97f0 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--23.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--23", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Calculate the population growth rate of Canada from 2020 to 2023 using Wolfram Alpha.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "mean population growth rate of Canada from 2020 to 2023 is 0.9998% per year" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--24.json b/config_files/webvoyager/Wolfram Alpha--24.json new file mode 100644 index 0000000..68e67e0 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--24.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--24", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Solve the differential equation y''(t) - 2y'(t) + 10y(t) = 0 and display its general solution.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "y(t) = c1 e^t sin(3t) + c2 e^t cos(3t)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--25.json b/config_files/webvoyager/Wolfram Alpha--25.json new file mode 100644 index 0000000..e3c5e9d --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--25.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--25", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Calculate the final position and velocity of a projectile launched at 45 degrees with an initial speed of 30 m/s after 3 seconds.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "if g=9.81; x = 63.64m, y = 19.49m; Vx = 21.21 m/s, Vy = -8.22 m/s" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--27.json b/config_files/webvoyager/Wolfram Alpha--27.json new file mode 100644 index 0000000..d87f201 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--27.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--27", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Display the thermal conductivity of Copper (Cu) and Aluminum (Al) at 25 degrees Celsius.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "401.2 W/(m K); 236.9 W/(m K)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--28.json b/config_files/webvoyager/Wolfram Alpha--28.json new file mode 100644 index 0000000..1527760 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--28.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--28", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Identify the character in Unicode range 9632 to 9650 that represents a hollow parallelogram.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "9649 or U+25B1" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--3.json b/config_files/webvoyager/Wolfram Alpha--3.json new file mode 100644 index 0000000..5eb276e --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--3.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--3", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Let g(x) be the integral of x^2 cos(2x). Write the expression of g(x).", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "1/4 (2 x cos(2 x) + (-1 + 2 x^2) sin(2 x)) + Constant" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--32.json b/config_files/webvoyager/Wolfram Alpha--32.json new file mode 100644 index 0000000..f43362b --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--32.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--32", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Print all prime numbers between 1000 and 1200 using Wolfram alpha.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193." + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--33.json b/config_files/webvoyager/Wolfram Alpha--33.json new file mode 100644 index 0000000..fa9b90d --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--33.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--33", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Identify the electrical energy output of a hydroelectric power plant named Itaipu Dam in 2023 using Wolfram Alpha.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "89.5 TWh (terawatt hours)" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--34.json b/config_files/webvoyager/Wolfram Alpha--34.json new file mode 100644 index 0000000..9c428b9 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--34.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--34", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Calculate the mass of Jupiter compared to Earth using Wolfram Alpha. Also, find the length of one day on Jupiter.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "317.8 times that of Earth, and the length of one day on Jupiter is approximately 9.925 hours" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--35.json b/config_files/webvoyager/Wolfram Alpha--35.json new file mode 100644 index 0000000..f515fcb --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--35.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--35", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Calculate the determinant of a 6x6 Hilbert matrix.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "1/186313420339200000" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--36.json b/config_files/webvoyager/Wolfram Alpha--36.json new file mode 100644 index 0000000..1b1c4b7 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--36.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--36", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Determine the convergence or divergence of the series \u03a3 (n=1 to \u221e) of 1/(n^3 + 1).", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "converges" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--37.json b/config_files/webvoyager/Wolfram Alpha--37.json new file mode 100644 index 0000000..936a6fd --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--37.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--37", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "How many days are there between February 12, 2024 and August 9, 2050?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "9675" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--38.json b/config_files/webvoyager/Wolfram Alpha--38.json new file mode 100644 index 0000000..f8adeda --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--38.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--38", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Compute the length of a curve defined by y = 2x^3 - 3x^2 + 4x - 5 from x = 0 to x = 3.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "around 39.2" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--39.json b/config_files/webvoyager/Wolfram Alpha--39.json new file mode 100644 index 0000000..5876cb3 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--39.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--39", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Use Wolfram alpha to write the expression of the ellipse x^2 + 3 y^2 = 4 rotated 33 degrees counterclockwise.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "x^2(\\sin(\frac{2\u03c0}{15}) - 2) + 2xy \\cos(\frac{2\u03c0}{15}) + 4 = y^2(2 + \\sin(\frac{2\u03c0}{15}))" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--4.json b/config_files/webvoyager/Wolfram Alpha--4.json new file mode 100644 index 0000000..ff86e05 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--4.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--4", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Pack 24 circles in a circle radius r. Compare Densest known packing and Square packing. Then tell me the radius of the inner circles.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "Densest known packing: 0.176939r; Square packing: 0.163961r" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--40.json b/config_files/webvoyager/Wolfram Alpha--40.json new file mode 100644 index 0000000..50bcec9 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--40.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--40", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Approximate amount of fat burned by a 28yo, 172cm tall, 70kg woman running for 30min at a pace of 6min/mile.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "around 0.078 kg" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--41.json b/config_files/webvoyager/Wolfram Alpha--41.json new file mode 100644 index 0000000..2928443 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--41.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--41", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "What is the approximate Heart Rate Reserve of a 50 year old man who has a heart rate of 60bpm at rest.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "110 bpm" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--42.json b/config_files/webvoyager/Wolfram Alpha--42.json new file mode 100644 index 0000000..6b6e653 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--42.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--42", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "What is the raw memory of a 100.2\" * 123.5\" true colour picture at 72 ppi?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "192 MB" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--43.json b/config_files/webvoyager/Wolfram Alpha--43.json new file mode 100644 index 0000000..3442437 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--43.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--43", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "A polyominoes of order 6 means you have 6 identical squares to combine different shapes (2-sided). How many combinations are there? Looking at all the shapes in the result, how many of them have only 2 rows in total?", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "35; 12" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--45.json b/config_files/webvoyager/Wolfram Alpha--45.json new file mode 100644 index 0000000..afafdc5 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--45.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--45", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "A 175cm tall, 85kg, 40yo man climbs 2500 steps at about 18cm per step and 40 steps per minute. summarise the Metabolic properties.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "energy expenditure | 2720 kJ (kilojoules); average energy expenditure per step | 1.1 kJ/step (kilojoules per step); fat burned | 0.0842 kg (kilograms); oxygen consumption | 129.9 L (liters); metabolic equivalent | 7 metabolic equivalents" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--5.json b/config_files/webvoyager/Wolfram Alpha--5.json new file mode 100644 index 0000000..88c92c7 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--5.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--5", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Show the solution of y\"(z) + sin(y(z)) = 0 from wolframalpha.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "y(z) = \u00b1 2 am(1/2 sqrt((c_1 + 2) (z + c_2)^2), 4/(c_1 + 2)), am(x, m) is the Jacobi amplitude function" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--6.json b/config_files/webvoyager/Wolfram Alpha--6.json new file mode 100644 index 0000000..d34aa4a --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--6.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--6", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Simplify x^5-20x^4+163x^3-676x^2+1424x-1209 so that it has fewer items.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "7 + 3 (-4 + x)^3 + (-4 + x)^5" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--7.json b/config_files/webvoyager/Wolfram Alpha--7.json new file mode 100644 index 0000000..b2ccc40 --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--7.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--7", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Give the final angle and final length after 6s of a Spring pendulum with spring equilibrium length=0.12m, initial length=0.24m, initial angle=80deg, mass=1kg, spring constant=120 N/m .", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "-73.26\u00b0 from vertical; 0.252 m" + } + } +} \ No newline at end of file diff --git a/config_files/webvoyager/Wolfram Alpha--9.json b/config_files/webvoyager/Wolfram Alpha--9.json new file mode 100644 index 0000000..c32cb9e --- /dev/null +++ b/config_files/webvoyager/Wolfram Alpha--9.json @@ -0,0 +1,20 @@ +{ + "sites": [ + "wolfram alpha" + ], + "task_id": "Wolfram Alpha--9", + "require_login": false, + "storage_state": null, + "start_url": "https://www.wolframalpha.com/", + "geolocation": null, + "intent": "Annual energy production of Diablo Canyon 2 in 2010.", + "require_reset": false, + "eval": { + "eval_types": [ + "string_match" + ], + "reference_answers": { + "fuzzy_match": "9752 GW h/yr (gigawatt hours per year)" + } + } +} \ No newline at end of file diff --git a/eval_webarena.py b/eval_webarena.py new file mode 100644 index 0000000..67051e5 --- /dev/null +++ b/eval_webarena.py @@ -0,0 +1,141 @@ +import os +import time +import re +import argparse +import os +import shutil + +from AgentOccam.env import WebArenaEnvironmentWrapper + +from AgentOccam.AgentOccam import AgentOccam +from webagents_step.utils.data_prep import * +from webagents_step.agents.step_agent import StepAgent + +from AgentOccam.prompts import AgentOccam_prompt +from webagents_step.prompts.webarena import step_fewshot_template_adapted, step_fewshot_template + +from AgentOccam.utils import EVALUATOR_DIR + +def run(): + parser = argparse.ArgumentParser( + description="Only the config file argument should be passed" + ) + parser.add_argument( + "--config", type=str, required=True, help="yaml config file location" + ) + args = parser.parse_args() + with open(args.config, "r") as file: + config = DotDict(yaml.safe_load(file)) + + if config.logging: + if config.logname: + dstdir = f"{config.logdir}/{config.logname}" + else: + dstdir = f"{config.logdir}/{time.strftime('%Y%m%d-%H%M%S')}" + os.makedirs(dstdir, exist_ok=True) + shutil.copyfile(args.config, os.path.join(dstdir, args.config.split("/")[-1])) + random.seed(42) + + config_file_list = [] + + task_ids = config.env.task_ids + if hasattr(config.env, "relative_task_dir"): + relative_task_dir = config.env.relative_task_dir + else: + relative_task_dir = "tasks" + if task_ids == "all" or task_ids == ["all"]: + task_ids = [filename[:-len(".json")] for filename in os.listdir(f"config_files/{relative_task_dir}") if filename.endswith(".json")] + for task_id in task_ids: + config_file_list.append(f"config_files/{relative_task_dir}/{task_id}.json") + + fullpage = config.env.fullpage if hasattr(config.env, "fullpage") else True + current_viewport_only = not fullpage + + if config.agent.type == "AgentOccam": + agent_init = lambda: AgentOccam( + prompt_dict = {k: v for k, v in AgentOccam_prompt.__dict__.items() if isinstance(v, dict)}, + config = config.agent, + ) + elif config.agent.type == "AgentOccam-SteP": + agent_init = lambda: StepAgent( + root_action = config.agent.root_action, + action_to_prompt_dict = {k: v for k, v in step_fewshot_template_adapted.__dict__.items() if isinstance(v, dict)}, + low_level_action_list = config.agent.low_level_action_list, + max_actions=config.env.max_env_steps, + verbose=config.verbose, + logging=config.logging, + debug=config.debug, + model=config.agent.model_name, + prompt_mode=config.agent.prompt_mode, + ) + elif config.agent.type == "SteP-replication": + agent_init = lambda: StepAgent( + root_action = config.agent.root_action, + action_to_prompt_dict = {k: v for k, v in step_fewshot_template.__dict__.items() if isinstance(v, dict)}, + low_level_action_list = config.agent.low_level_action_list, + max_actions=config.env.max_env_steps, + verbose=config.verbose, + logging=config.logging, + debug=config.debug, + model=config.agent.model_name, + prompt_mode=config.agent.prompt_mode, + ) + else: + raise NotImplementedError(f"{config.agent.type} not implemented") + + + for config_file in config_file_list: + with open(config_file, "r") as f: + task_config = json.load(f) + print(f"Task {task_config['task_id']}.") + if os.path.exists(os.path.join(dstdir, f"{task_config['task_id']}.json")): + print(f"Skip {task_config['task_id']}.") + continue + if task_config['task_id'] in list(range(600, 650))+list(range(681, 689)): + print("Reddit post task. Sleep 30 mins.") + time.sleep(1800) + env = WebArenaEnvironmentWrapper(config_file=config_file, + max_browser_rows=config.env.max_browser_rows, + max_steps=config.max_steps, + slow_mo=1, + observation_type="accessibility_tree", + current_viewport_only=current_viewport_only, + viewport_size={"width": 1920, "height": 1080}, + headless=config.env.headless, + global_config=config) + + agent = agent_init() + objective = env.get_objective() + status = agent.act(objective=objective, env=env) + env.close() + + if config.logging: + with open(config_file, "r") as f: + task_config = json.load(f) + log_file = os.path.join(dstdir, f"{task_config['task_id']}.json") + log_data = { + "task": config_file, + "id": task_config['task_id'], + "model": config.agent.actor.model if hasattr(config.agent, "actor") else config.agent.model_name, + "type": config.agent.type, + "trajectory": agent.get_trajectory(), + } + summary_file = os.path.join(dstdir, "summary.csv") + summary_data = { + "task": config_file, + "task_id": task_config['task_id'], + "model": config.agent.actor.model if hasattr(config.agent, "actor") else config.agent.model_name, + "type": config.agent.type, + "logfile": re.search(r"/([^/]+/[^/]+\.json)$", log_file).group(1), + } + if status: + summary_data.update(status) + log_run( + log_file=log_file, + log_data=log_data, + summary_file=summary_file, + summary_data=summary_data, + ) + +if __name__ == "__main__": + run() diff --git a/evaluation_harness/__init__.py b/evaluation_harness/__init__.py new file mode 100644 index 0000000..e942c10 --- /dev/null +++ b/evaluation_harness/__init__.py @@ -0,0 +1,6 @@ +from .evaluators import * +from .helper_functions import ( + shopping_get_latest_order_url, + shopping_get_sku_latest_review_author, + shopping_get_sku_latest_review_rating, +) diff --git a/evaluation_harness/evaluators.py b/evaluation_harness/evaluators.py new file mode 100644 index 0000000..527c9f9 --- /dev/null +++ b/evaluation_harness/evaluators.py @@ -0,0 +1,419 @@ +"""base class for evaluation""" +# answer string match +import collections +import html +import importlib +import json +import time +import urllib +from pathlib import Path +from typing import Any, Tuple, Union, Optional + +from beartype import beartype +import nltk +nltk.download('punkt') +from nltk.tokenize import word_tokenize # type: ignore + +from playwright.sync_api import CDPSession, Page + +from browser_env.actions import Action +from browser_env.utils import StateInfo +from evaluation_harness.helper_functions import ( + PseudoPage, + gitlab_get_project_memeber_role, + llm_fuzzy_match, + llm_ua_match, + reddit_get_post_url, + shopping_get_latest_order_url, + shopping_get_sku_latest_review_author, + shopping_get_sku_latest_review_rating, +) + +Trajectory = list[Union[Action, StateInfo]] + + +class Evaluator(object): + def __init__(self, eval_tag: str = "") -> None: + self.eval_tag = eval_tag + + @beartype + def __call__( + self, + trajectory: Trajectory, + config_file: Path | str, + page: Page | PseudoPage, + client: CDPSession, + ) -> float: + raise NotImplementedError + + @staticmethod + def get_last_action(trajectory: Trajectory) -> Action: + try: + # is_bearable(trajectory[-1], Action) + last_action = trajectory[-1] + except Exception: + raise ValueError( + "The last element of trajectory should be an action, add a fake stop action if needed" + ) + + return last_action # type: ignore[return-value] + + @staticmethod + def get_last_state(trajectory: Trajectory) -> StateInfo: + try: + # is_bearable(trajectory[-2], StateInfo) + last_state = trajectory[-2] + except Exception: + raise ValueError( + "The second last element of trajectory should be a state, add a fake stop action if needed" + ) + + return last_state # type: ignore[return-value] + + +class StringEvaluator(Evaluator): + """Check whether the answer is correct with: + exact match: the answer is exactly the same as the reference answer + must include: each phrase in the reference answer must be included in the answer + fuzzy match: the answer is similar to the reference answer, using LLM judge + """ + + @staticmethod + @beartype + def clean_answer(answer: str) -> str: + answer = answer.strip() + if answer.startswith("'") and answer.endswith("'"): + answer = answer[1:-1] + elif answer.startswith('"') and answer.endswith('"'): + answer = answer[1:-1] + return answer.lower() + + @staticmethod + @beartype + def exact_match(ref: str, pred: str) -> float: + return float( + StringEvaluator.clean_answer(pred) + == StringEvaluator.clean_answer(ref) + ) + + @staticmethod + @beartype + def must_include(ref: str, pred: str, tokenize: bool = False) -> float: + clean_ref = StringEvaluator.clean_answer(ref) + clean_pred = StringEvaluator.clean_answer(pred) + # tokenize the answer if the ref is a single word + # prevent false positive (e.g, 0) + if " |or| " in clean_ref or " |OR| " in clean_ref: + refs = clean_ref.split(" |or| ") if " |or| " in clean_ref else clean_ref.split(" |OR| ") + refs = [r.strip() for r in refs] + for r in refs: + if ( + tokenize + and len(r) == 1 + and len(word_tokenize(r)) == 1 + ): + tok_pred = word_tokenize(r) + if r in tok_pred: + return float(r in tok_pred) + else: + if r in clean_pred: + return float(r in clean_pred) + return 0.0 + if ( + tokenize + and len(clean_ref) == 1 + and len(word_tokenize(clean_ref)) == 1 + ): + tok_pred = word_tokenize(clean_pred) + return float(clean_ref in tok_pred) + else: + return float(clean_ref in clean_pred) + + @staticmethod + @beartype + def fuzzy_match(ref: str, pred: str, intent: str) -> float: + return llm_fuzzy_match(pred, ref, intent) + + @staticmethod + @beartype + def ua_match(ref: str, pred: str, intent: str) -> float: + return llm_ua_match(pred, ref, intent) + + def __call__( + self, + trajectory: Trajectory, + config_file: Path | str, + page: Page | PseudoPage | None = None, + client: CDPSession | None = None, + ) -> float: + with open(config_file, "r") as f: + configs = json.load(f) + + last_action = self.get_last_action(trajectory) + pred = self.clean_answer(last_action["answer"]) + + score = 1.0 + for approach, value in configs["eval"]["reference_answers"].items(): + match approach: + case "exact_match": + score *= self.exact_match(ref=value, pred=pred) + + case "must_include": + assert isinstance(value, list) + must_include_score = 0. + for must_value in value: + must_include_score += self.must_include( + ref=must_value, + pred=pred, + tokenize=(len(value) == 1), + ) + must_include_score /= len(value) + score *= must_include_score + case "fuzzy_match": + intent = configs["intent"] + if value == "N/A": + # if the instruction only asks the model to generate N/A when encountering an unachievable task + # without more concrete reasons + score *= self.exact_match(ref=value, pred=pred) + # if the instruction also asks the model to generate the reason why the task is unachievable + # this should be the default as it will prevent false positive N/A` + if score != 1: + score = 1.0 * self.ua_match( + intent=configs["intent"], + ref=configs["eval"]["string_note"], + pred=pred, + ) + else: + if isinstance(value, list): + fuzzy_match_value = "; ".join(value) + else: + fuzzy_match_value = value + fuzzy_match_score = self.fuzzy_match( + ref=fuzzy_match_value, pred=pred, intent=intent + ) + score *= fuzzy_match_score + return score + + +class URLEvaluator(Evaluator): + """Check URL matching""" + + @beartype + def __call__( + self, + trajectory: Trajectory, + config_file: Path | str, + page: Page | PseudoPage, + client: CDPSession | None = None, + ) -> float: + with open(config_file, "r") as f: + configs = json.load(f) + + def clean_url(url: str) -> str: + url = str(url) + url = url.rstrip("/") + url = url.lower() + return url + + def parse_url(url: str) -> tuple[str, dict[str, list[str]]]: + """Parse a URL into its base, path, and query components.""" + parsed_url = urllib.parse.urlparse(url) + base_path = parsed_url.netloc + parsed_url.path + query = urllib.parse.parse_qs(parsed_url.query) + return base_path, query + + def parse_urls( + urls: list[str], + ) -> tuple[list[str], dict[str, set[str]]]: + """Parse a list of URLs.""" + base_paths = [] + queries = collections.defaultdict(set) + for url in urls: + base_path, query = parse_url(url) + base_paths.append(base_path) + for k, v in query.items(): + queries[k].update(v) + return base_paths, queries + + pred = clean_url(page.url) + matching_rule = configs["eval"].get("url_note", "GOLD in PRED") + if matching_rule == "GOLD in PRED": + if "or" in configs["eval"].keys(): + or_ref_urls_list = [configs["eval"]["reference_url"]] + [item["reference_url"] for item in configs["eval"]["or"]] + else: + or_ref_urls_list = [configs["eval"]["reference_url"]] + or_score_list = [] + for or_ref_urls in or_ref_urls_list: + ref_urls = or_ref_urls.split(" |OR| ") + ref_urls = [clean_url(url) for url in ref_urls] + ref_base_paths, ref_queries = parse_urls(ref_urls) + pred_base_paths, pred_query = parse_url(pred) + + base_score = float( + any( + [ + ref_base_path in pred_base_paths + for ref_base_path in ref_base_paths + ] + ) + ) + query_score = 1.0 + for k, possible_values in ref_queries.items(): + query_score *= float( + any( + possible_ref_value in pred_query.get(k, []) + for possible_ref_value in possible_values + ) + ) + or_score_list.append(base_score * query_score) + score = max(or_score_list) + + else: + raise ValueError(f"Unknown matching rule: {matching_rule}") + + return score + + +class HTMLContentEvaluator(Evaluator): + """Check whether the contents appear in the page""" + + @beartype + def __call__( + self, + trajectory: Trajectory, + config_file: Path | str, + page: Page | PseudoPage, + client: CDPSession | None = None, + ) -> float: + with open(config_file, "r") as f: + configs = json.load(f) + + targets = configs["eval"]["program_html"] + + score = 1.0 + for target in targets: + if "or" in target.keys(): + or_target_list = [target] + [t for t in target["or"]] + else: + or_target_list = [target] + or_score_list = [] + for or_target in or_target_list: + target_url: str = or_target["url"] # which url to check + if target_url.startswith("func"): + func = target_url.split("func:")[1] + func = func.replace("__last_url__", page.url) + target_url = eval(func) + + locator: str = or_target["locator"] # js element locator + + # navigate to that url + if target_url != "last": + page.goto(target_url) + time.sleep(3) # TODO [shuyanzh]: fix this hard-coded sleep + + # empty, use the full page + if not locator.strip(): + selected_element = page.content() + # use JS to select the element + elif locator.startswith("document.") or locator.startswith( + "[...document." + ): + if "prep_actions" in or_target: + try: + for prep_action in or_target["prep_actions"]: + page.evaluate(f"() => {prep_action}") + except Exception: + pass + try: + selected_element = str(page.evaluate(f"() => {locator}")) + if not selected_element: + selected_element = "" + except Exception: + # the page is wrong, return empty + selected_element = "" + # run program to call API + elif locator.startswith("func:"): # a helper function + func = locator.split("func:")[1] + func = func.replace("__page__", "page") + selected_element = eval(func) + else: + raise ValueError(f"Unknown locator: {locator}") + + selected_element = html.unescape(selected_element) + + if "exact_match" in or_target["required_contents"]: + required_contents = or_target["required_contents"]["exact_match"] + cur_score = StringEvaluator.exact_match( + ref=required_contents, pred=selected_element + ) + or_score_list.append(cur_score) + print(f"[exact match] {cur_score}, selected element: {selected_element}, required contents: {required_contents}") + elif "must_include" in or_target["required_contents"]: + required_contents = or_target["required_contents"]["must_include"] + assert isinstance(required_contents, list) + content_score_list = [] + for content in required_contents: + content_or = content.split(" |OR| ") + cur_score = any( + [ + StringEvaluator.must_include( + ref=content, + pred=selected_element, + tokenize=False, + ) + for content in content_or + ] + ) + content_score_list.append(cur_score) + # score *= float(cur_score) + print(f"[must include] {cur_score}, selected element: {selected_element}, required contents: {content_or}") + or_score_list.append(sum(content_score_list)/len(content_score_list)) + else: + raise ValueError( + f"Unknown required_contents: {or_target['required_contents'].keys()}" + ) + or_score = max(or_score_list) + score *= or_score + + return score + + +class EvaluatorComb: + def __init__(self, evaluators: list[Evaluator]) -> None: + self.evaluators = evaluators + + @beartype + def __call__( + self, + trajectory: Trajectory, + config_file: Path | str, + page: Optional[Page | PseudoPage] = None, + client: Optional[CDPSession] = None, + ) -> float: + score = 1.0 + for evaluator in self.evaluators: + cur_score = evaluator(trajectory, config_file, page, client) + score *= cur_score + return score + + +@beartype +def evaluator_router(config_file: Path | str) -> EvaluatorComb: + """Router to get the evaluator class""" + with open(config_file, "r") as f: + configs = json.load(f) + + eval_types = configs["eval"]["eval_types"] + evaluators: list[Evaluator] = [] + for eval_type in eval_types: + match eval_type: + case "string_match": + evaluators.append(StringEvaluator()) + case "url_match": + evaluators.append(URLEvaluator()) + case "program_html": + evaluators.append(HTMLContentEvaluator()) + case _: + raise ValueError(f"eval_type {eval_type} is not supported") + + return EvaluatorComb(evaluators) diff --git a/evaluation_harness/helper_functions.py b/evaluation_harness/helper_functions.py new file mode 100644 index 0000000..d1a55cf --- /dev/null +++ b/evaluation_harness/helper_functions.py @@ -0,0 +1,220 @@ +"""Implements helper functions to assist evaluation cases where other evaluators are not suitable.""" +import json +from typing import Any +from urllib.parse import urlparse + +import requests +from playwright.sync_api import CDPSession, Page + +from browser_env.env_config import ( + ACCOUNTS, + GITLAB, + MAP, + REDDIT, + SHOPPING, + SHOPPING_ADMIN, + WIKIPEDIA, +) +from llms.providers.openai_utils import ( + generate_from_openai_chat_completion, +) + + +def shopping_get_auth_token() -> str: + response = requests.post( + url=f"{SHOPPING}/rest/default/V1/integration/admin/token", + headers={"content-type": "application/json"}, + data=json.dumps( + { + "username": ACCOUNTS["shopping_site_admin"]["username"], + "password": ACCOUNTS["shopping_site_admin"]["password"], + } + ), + ) + token: str = response.json() + return token + + +def shopping_get_latest_order_url() -> str: + """Get the latest order url from the shopping website.""" + + header = { + "Authorization": f"Bearer {shopping_get_auth_token()}", + "Content-Type": "application/json", + } + + params = { + "searchCriteria[sortOrders][0][field]": "created_at", + "searchCriteria[sortOrders][0][direction]": "DESC", + "searchCriteria[pageSize]": "1", + } + + response = requests.get( + f"{SHOPPING}/rest/V1/orders", params=params, headers=header + ) + assert response.status_code == 200 + response_obj = response.json()["items"][0] + order_id = int(response_obj["increment_id"]) + order_url = f"{SHOPPING}/sales/order/view/order_id/{order_id}/" + return order_url + + +def shopping_get_sku_latest_review_author(sku: str) -> str: + """Get the latest review for shopping admin.""" + header = { + "Authorization": f"Bearer {shopping_get_auth_token()}", + "Content-Type": "application/json", + } + response = requests.get( + f"{SHOPPING}/rest/V1/products/{sku}/reviews", headers=header + ) + assert response.status_code == 200 + response_obj = response.json() + if len(response_obj) == 0: + return "" + author: str = response_obj[-1]["nickname"] + return author + + +def shopping_get_sku_latest_review_rating(sku: str) -> str: + """Get the latest review for shopping admin.""" + header = { + "Authorization": f"Bearer {shopping_get_auth_token()}", + "Content-Type": "application/json", + } + response = requests.get( + f"{SHOPPING}/rest/V1/products/{sku}/reviews", headers=header + ) + assert response.status_code == 200 + response_obj = response.json() + if len(response_obj) == 0: + return "" + assert response_obj[0]["ratings"][0]["rating_name"] == "Rating" + rating: str = str(response_obj[-1]["ratings"][0]["percent"]) + return rating + + +def reddit_get_post_url(url: str) -> str: + """Get the post url""" + # Url is http://domain/f/subreddit/post_id/... + # get domain, subreddit, post_id + domain = urlparse(url).netloc + tok_url = urlparse(url).path.split("/") + # not a valid post/comment url, return the url as is + if len(tok_url) < 4: + return url + if tok_url[1] != "f": + return url + subreddit = urlparse(url).path.split("/")[2] + post_id = urlparse(url).path.split("/")[3] + scheme = urlparse(url).scheme + post_url = f"{scheme}://{domain}/f/{subreddit}/{post_id}/" + return post_url + + +def gitlab_get_project_memeber_role(page: Page, account_name: str) -> str: + # get the account index + try: + account_idx = page.evaluate( + f"""(() => {{ + const elements = document.querySelectorAll("td[data-label='Account'] span.gl-avatar-labeled-sublabel"); + let index = -1; // Default value if not found + + for(let i = 0; i < elements.length; i++) {{ + if(elements[i].outerText === '@{account_name}') {{ + index = i; + break; + }} + }} + + return index; + }})()""" + ) + + # get the role + role: str = page.evaluate( + f"""(() => {{ + return document.querySelectorAll("td.col-max-role span")[{account_idx}].outerText; + }})()""" + ) + except Exception: + role = "" + + return role + + +def llm_fuzzy_match(pred: str, reference: str, question: str) -> float: + """Check whether the prediction matches the reference with GPT4-turbo""" + messages: list[dict[str, Any]] = [] + # construct the question to ask + message = "Help a teacher to grade the answer of a student given a question. Keep in mind that the student has performed the action to get the answer. They are allowed to use different phrasing or wording to answer the question. The goal is to evaluate whether the key points in the reference answer are included in the student's answer. We allow answers with additional information that doesn't contradict the reference answer and review them as fully (not partially) correct.\n" + message += f"question: {question}\n" + message += f"reference answer: {reference}\n" + message += "all the string 'N/A' that you see is a special sequence that means 'not achievable'\n" + message += f"student answer: {pred}\n" + message += "Conclude the judgement by correct/incorrect/partially correct and explain why." + messages = [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": message}, + ] + response = generate_from_openai_chat_completion( + model="gpt-4-1106-preview", + messages=messages, + temperature=0, + max_tokens=768, + top_p=1.0, + context_length=0, + ).lower() + print(response) + if "partially correct" in response or "incorrect" in response: + return 0.0 + else: + assert "correct" in response + return 1.0 + +def llm_ua_match(pred: str, reference: str, question: str) -> float: + """Check whether the prediction matches the reference with GPT-turbo""" + messages: list[dict[str, Any]] = [] + # construct the question to ask + message = "" + message += f"task: {question}\n" + message += f"actual unachievable reason: {reference}\n" + message += f"reported unachievable reason: {pred}\n" + message += ( + "The task described above is inherently unachievable due to the reason specified under 'actual unachievable reason'. " + "An individual previously attempted this task and was unable to complete it. They provided a reason for their failure, " + "which is listed under 'reported unachievable reason'. Your role is to review both the actual and reported reasons. " + "Determine if the reported reason aligns with the actual reason, even if implicitly. " + "If the stated reason is in line with the actual reason, respond with 'same'. Otherwise, respond with 'different'." + ) + messages = [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": message}, + ] + + response = generate_from_openai_chat_completion( + model="gpt-4-1106-preview", + messages=messages, + temperature=0, + max_tokens=768, + top_p=1.0, + context_length=0, + ).lower() + if "different" in response: + return 0.0 + else: + assert "same" in response + return 1.0 + + +class PseudoPage: + def __init__(self, original_page: Page, url: str): + self.url = url + self.original_page = original_page + + def __getattr__(self, attr: str) -> Any: + # Delegate attribute access to the original page object + if attr not in ["url"]: + return getattr(self.original_page, attr) + else: + return getattr(self, attr) diff --git a/files/overview.png b/files/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..15f09da60bfd20a1a6dbdb9f5d1050e865312f56 GIT binary patch literal 2111599 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 z zJ?Jay4UbLRgYaBY*&yQccZKiY>%dIw4EbxN2nB-HJ?4r(qK|)k-DblJHAQ4?O4&sC^aTFRuSTh;eZ0ii^1n8a^>LuU!u(t0POw@dWwoO z1>U-?Pxj2;d zYNl9YI>2hk&5y%pY_!hmu4Va;=%FUO;5@ODMOdZYU?;R6$fI4cj}lL+G+QWv8UtRP z#NK}mTH}|Ax1UTO;S7fR?$yqrrmWc#9MUyJMXL8oYl=nbMP!e?4u@i`WWGG8$t0l6 zF(Ah3FfJ7r%2cEOY({3>m$IJCl3*`?_HLLy zE@15GC~)RG>PG*|UFrKaJ>6{H`EQW{Qa-Bl{*)RDxM^g{FW-(2)emIRQo zux`|lkZ!BPMQ|K?G>~oU!^$EGQE3R*dI5f$mml9~RDRhyf<&w9QUdN(}_3!vQYXT8-N?<*Q4y^&&peZl_n-yPhp$IqMk0?8D{^YLs0{ri5gYiAKYN|Hl44Yw(nTPF$s@{44&|>Gg*hmEN z?$$q|j)@;@DC#cX=ZSP0tM@&aJBN94P!@3m!F{GOGSX*R5URZ8zMEKE@9LF{&*^P+ za{eTv*F_8vDf%zmcX#$k)Slpbg~)lWL^dLrFx6gr_y^?`yx&zM+_N z--1Y-=)JegAM`3l_1IrkNduY?m$f2e$PiU5`_dP)zA+*TXwvcQGaNv92EtNu)9v-s zZY$-E<3G1HHfkpGXB^~D>@BII(imrgEx_rxFAUO2Snf(?gh;u# zR1?yR)%Pc*rSHJ%)Y#bBMe%K?zqbQxCoHVz}Q`Zr+oQ!@pTSpCZ51d+p~saZVhAqx zlp2nPuhf2L)eBAbJz4zha=7*o$XiE^wLF$Fb)hJ_ROEVjc;O8P zy0U55K}XQ;S2(HyTV5*2KAFRD^aSPn7;~g80KjA7iP&g|B(a3dPeh z{1q4|1~fRh?O~+&<8O%njeGrPy8iZ&gSUKI2Th9G(E%J8WDcJ-dCd9cO2N;`b#W2> z+wbj9yz)D%!&%C`?5~5IwoWiexVYtfL8LLhAb(vi$*z&jeWCn-)gR!uG@g(Z@aghy zS*jg7pWE>ie#3GY6mRg@_xT7G)?4n3@QPuYFKy`pGj4t~!ah!sqXO3~Z~2uL&I=my z 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
IaeU*pv&;r%;-!E*uC3T` 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

RGJ3^L;PrWqhmU={B9XW9 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≤p7vr*v+L}_c?=Jw`}ju7 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%0AWJ+L_)J=D`9)^p7u za?dmGyr1$ok26L@X;@DqQu(D6_B&k915je>Ag08*R43n3_B_W{kJWhbpBRp*7Mq)C zxA03G9NZ0*eWtfipvv{$3iUVPo4)RS2Z&>)BT(6B6>Fln4$J^xJwQIfxNtn1I^-$=sX@A*@ZD;aVS4!!|%*#y;Ay9`TJX zI<9u>a#SNJ$Gdd{-qj|{0A+Y5dH&0lC7zl+@7}zUt4ZC2{d7*Vc8SGiC#lp!uZJHc z9-0M?GXo2W2V0k&zEqE+J(eBgc-ZpC6mCL?9BC_J?gsB}anfA@ zh2mmBBq!k#@i_F3seepPNA5bM8-s;=DWRA6Bo4>heevFGi!}h(j$78pWzwl<;L$;7=Upw zLfk=5OwT}8M;}4SV?m&Wj=E@$UqyAg%&>fQ_|=x!wlpF`IahgJ zZQX{c1B_!pgFI=5W_I3bAzo{xYLU!h#`F+sUSRXc7%$EBpLsCn!o)NK0)o&k68f@OiLsBTWn)x_wr%99!W~VYjj%w zK5x|G8MYUi!MOxn@nUoq{?I`uNpC%xMx&6#s2aQAPGz(>J#8}!DK~~x=4tl9eExaR zo_nzvSp2G>z0A7KIl z@7r}%u$qwnxJ?Qc0^zFplQ z+ffM%fI7nanKziu^bYlN%6X%)Od@#UGbG4N^)h70DDCp}`}5c){aY?N$e?&|Fp%x4 z#Z0=YlMsoGjV<%{m{JtH#~EJX*N&X4L0zY%@q!1epf9Ce%;3?iG7MrjIsM~(Gv!& zr!ufVsS&lOxN^2 zq88{;TPNN2G+Vx%*o~A|P!0iG==IQewQ2y>*7qrB4Lvp>i}}rvOeba|!Tg?HH28ii zvt5@@oFus{vUD7hP4DmB={NAhxo0E{1n9;pOBiuKI1$fbG}3VMU0XXEd1yL`-B&mP zYO>6gUuIkV4oy1RDKXzP8yOcsKI@v#7AVFTUWPu+;_IfFJM0O{0+f` zJ`epn8gru;pCbK5aAM-vU;+R7r}PFg)J*Q z`OsR>sOD`au2)f0Ascr^)NjkH=R99jR7x77uFr@=bXQ^?y0tuvzhx|P=WRv@A}eIS zxIoPlWHAP>xY9m@g#|E`tZf5VKk;*9No!4=Wwp=zc4GE>XJEYU1(pobd-C4o?D6s) z+2>R#Jj`Eg-If#)*mMho%5DPlK4&^#a>OIA2|o?gmbiH6-YI_JUX+JPfyyu?m8zG* zdQY@>O8coj;&AeYK7wbN>7?y>pI3p*_>nNa2Mp5M9Fo#8w<`rTm*N^u9{#F! zoT#KS9hwU$^;cRGr)kkh`D@ap0+>hCIbb8uT#1UDLHFT!;f#!xF`CG^sn3!L~gIx0)+xVAlb%~RJtRaeyjs;_^58&>c8OkpB=X} zm|7*q??3j4&wm*%T-v!-di(K%m@~o1fM>o zGZ^yM@AO{a=e6dl=j51M4o=e0XEZA!>}*6aAsU)8PVIif;&wlyVq!YuMi!f$omEK0 zayaBMbA)NYhzOh0Q$Kl0dp=S&AfNGr7Q{|R&(}BS55E@ta?t9~_>v?F@N9U-J(K5n z+p?o~v2b}hfxHz=iU(3OL!U54{w#i5U%|RcrBkpixoc3SB~%e2^4_{PfbtrvWlD&x z`{nCCo5@h%PqLxFSG43P)HhD=akSqmQ01;k^_iD6oMR z4`gk&TCa?WFV$#iX{lylU=Qm`GlRK5B~S8E8G>GFun@4Fq^zpDnpzdsQ1AfD{%zJx ziwuk~TknT8fzuKl?=3)gIq%j$_tsWcL@$_2wL!g<_YPO-Hk|v8OxKZw0_w;*{Y8e} zu~rDyixt;fm5+LNPKx@ko!j=b(sUmZ>@p*gq7qjZ>h<-v^=!Kzb{U+MSeL9j`sC|p zwS=2%6Cv{5ZH~ex*N9cslMS^0J;S7UO$Se_oe7phx0Qes!z>JJ_&NMJBbCZ=2qn1@ z(C%fgQS*4kLC$6d>`b_BU2P*&to!EmRby>N2{eg8Ma$me>Xgl}z7(2N_M`oITVTX!{MP+d#IOTDrp>EiT$r2yIb5(j<$ZMoyKULC23pm@f(GeUlfsewjh36Z8s zN6&KUeQeC)=O0;o=D|P#Lsazs{ZQ0+!ViYm+P6+-IbBT2UE`@?a$=fMPoF=}(Q@MS zObB>4AwZCo#eZFkX*Cr1#BR28l#{GDT3$4_8R#F$^5VOVYQJ8!bK^HMVYPRn916TX zZs&YHgBNULx~GD)zI$K?k*m0S0+tQSdh~7#csb@Z-!=Il_j1?N$u~tj`?xvJ2cbY$ zN}s}}Ua^&#<7#K5EiRn#*7mZm$70Ss=90fOKW^Q$(*sT}W|KzT7&9V5D#yrH#||FO z)^A&sN|&aNvdG29cc+$@>=G=X$|+9F@YD+EY@wM^VVb}n4%66`FIk;aReoByBwX;sFgZnJ~l#f%&RNQK0b??L*ovx=->gu~+ z1@3x>hv&67Q`y`QR-R4nvwJ9x+^%}P#|@IZ`!3~jeL1N5`{w3GZnI1RyVkPtGLj8N zR9`%Ft-knA8PRsXv1IN$RwmshJw12F8*7*Tevz9?34&#jIptMoE(r4a+kLs^I)<#Q zgJAChUahNX0HaQYj&k<(%W`*^@w0q5S-bK6;+s{B*?O+wjT_+)&BnJ`4!V)=z1Gg? zXsATS@Or<+3^bI+X3MTpjm8k>%Ke8HkqIq!N05rnz3bk@?_oyMNi1%Pqx(VM^kZ{m z*?7OB@(9jdwF2W8$evCLQKrDQmX4#2rn%!*)PeuYO(zDYYQfuom;lF@)D^YecfeFN0In@7E|aA!ZI7iCLI(YLcp*DxskVFxLbQ&z4M&0wS9 z(xrHdLfNNmNYR7*dLW)oMIk3#m|2H)6~uqN$J?5pZ?znf;@A+*;ZBGpJwiP3`$GBp z21C}zCj+Y}NQY+VaMva|X-6wlB~N>5L-Ukv{x&4V90-i4sjpAhgGqbWDgK{?m}Wo| zzy4$$la=b%NPVLzp;eGvqkoiwqw~z7--M z(0rw0*p5}ND6h=!5KI6_-VqZrjre5~8`#yHG)Mi|XQ!_U+27X>!KIH_rDI@Fc=FnL zfk$#W+}~#x?_YbfEwd7Ijtas_WJI+u7O0!yZl* z@~-0>o4DacS(&=;#1CpHH5nxj=9(N&79D^YSpCSW;yQJohYx0foSFzel&*^4T&z%cm^n1eSi3iM zZ9@FScz;7B6P@ymel*wMoLi(WArY7XlW6C34jZyk;hi${piw-pn|U97>(HJzoHOpx zvVa~IO@^tU3+O6jrCD&5vxIErZ0>rwo?&>ge7heEUQD*^=lXXS>!7$-!9WSQ__qAF z0TK1Zc?!Km<{vUuqz(2>)S!blYsuta%c;cpo14U@cdyKmj^g@oA-Uup4JfKuIEyon z`*W0c3!7uIkrJ=L7MY9>XSgNXdtAgzoC=gz+t{kSZ!v_&v9C zP3c29(mxFBZpX!L) zl^vE*I~tELGH1KN;8G`mmP>eMI@{(PMpT&1B>L&=t-Ip%sywIY+$PbAS=1P2V+RLB z1LLAr8W~cMfssaRFw+G-(xoL$5_Bg96TGa$y(&)xY(44X!$ot4WY6(!pE<}#3Pb@5gauhf6$MduJkMnBqEHrd+U7 z=Ps!1P^l=t)mTh?uCi#9$RhF>RB~P&uWmSBJ?0*4m*6~Cm?A)D#=mkQk-^QvHF_5F z8P*nngA3p``%_T;IW2Q@#(EbxOnA0g6-(_z zjM5V%CEG7r{^^$v5@j^*siL~P0`O=e*pg?*^y9c|Ry$(V7}Lj<^ezi zRLQ~+x(RyRHqM+1LwDVHlRjP+kIQ)^!aOlNoTuMjg#4bFb0q;?MUc|l*pKhWe5B&= zw8y=N&{g4T9fqf$LHk|+_VE^!KVV^$^WRlS|3-aE0l+`IPX$hu4#jJ&_LKW(WXmcO z`Qj=5pL9yR#H()92O4p;sVN#d9`$~_YXxh3Ng}CWY@~xAN>%1Jk_1?+WZL zBqFv!45}>CobtiU%^C*oGsU?1e%9a&&45AfQi-@fy48~)h?YSsEjoP$n%H1moEepl zzE`UnV7WN9MYmDf;{34@Z8GPss+vRT=?9|f()&zDr?a@=e6reFH#I}eQt`H;{qoLR zSO7rHdDzc#nz@yJPQUbSQlp2*Q7bEa!@Y!H+iiR5119E5jdSZ?!#~m+W}+ud6@XKk z@``>qt{=h`l@!GTp)3TI^2mYT-JRXC}qK2r{_@1n^E?Cc^C&K(Hl1&V=wnCBp zMwe}Qj=p*9ZYCzC#H$0y@Z;SDje4*r8X8&@GPBRoQsY$3=7bD6ms3bW$zxlImt6> z$hzOzvN=*ecq&1B9E;(&L{f9p{xp_-U{RkXR}$!M7GK%_d(6gn4<<3@7_j!k{TPqWFE_G|OG!Al`*74CtBb_i*pmEr^1o|>YF&!Y_zjJqK#f{9KT?@w1n3R9d=hU zL+-rpstjL*skZX-2I|;6iJ}Ssr9~?r}Wi9D&p5abNM0-wJK5kbzkcSRF3PP{=VO75~@gw0m@0E;| z%ZBk>twfeit@0AcduJc%3IO+D&r@TSbmZCs?XOKIUSD!)1*8>zp4l?st>?AdfcN!X zJh^VOsybn!+x$y-U0)$)Q{83pFVVf0fu|?h&lAfo$=|zp^G_+2nbAd-mq!~(Mxvt) z7}KPG@FJ8xWY$Vw*DuK? z_|WZD?s?`(X7DB*3!Pk+|8w_w7aEHvA6cWW*K-Ra^FZ>#bmi*iYUEyGPH@E5P*FTp z=E%3!tv`xkF$zD5!%K4Y9@6azYXdS>vH7-WL>Jv3;pkJFmC zog^a^An+lKU#%gesO#_*xny!p*}|0HOxNDJxH7VqMo$($IU#@gv zNuzR^47V&8*-CYSr07q}r(_nx*pLuJDhmN`Qo< z_?z5g%vWvhS53B?lfNUjw+7Yo{b1AhrEl@YQ($4r$;rtt@bvoe3$7#@HP47gllfiE zm;--`inzAC-2^R^-RrOpV1cEU@cosz+aUOE6hvqG1QcOR*c@nq1-Ey~O2+M`nc*5= z;lHc;pITA`q)NZ~5Vso$o7+z#GgclM`F5&+cYAG5p-U-SO-=2C@#6-56b5Kqyby1r z0rPh-FB90VhZ22T@Zqq!%Im@kcOAe5cGUIo(t7UjPN>I(`#^ zcd6F6bU$8d%ohnN1@}Rj&6oagyw1DE z!C`?L86np%Gc&Uf?}=a`tgb^O$P*0}^(_+eW!wFJNgvBgDvTRH@}fW6KlOH(w{tdo zHaCb0_Z8QR_y?TNZ#xrNYil>R1Poad{W~HI|AFsB`VYOv-jX!%xta4xT~G0DLHc;k_c|P`FZy~0C{VoptpyG)*XsscaOUlE*F$|6J9&p! zKm3aOVq3=wT)_&enfSfp(_C)VFX0OFY>jIPVbT0u<}#pD=^E!&$v2)LyG&$|nEhp< z!~J?}{*S8p@rQ&!YOtk;liC^+#`thwpt@XszEU|<|z^O48YB!wWHQh(p?1UOCfA801dZ%aR1jPQYgyoc$5?1 zyI)E)u(7F#ZEoW`7<#?JAdU2*Xq6IaZQTOETnFY23hwJ(yV5y5_Hi{9*gv~EA|9x~ z^wj`(iVQo1w;C+jhKw>-%kw(xWMuLt9 zRPs`RK&!Fj`Ww>3EDkc~<=%@3%b$&ENI%WSTf40tzYvoB3e+{vvG{4pnJpz%>9YEC zGZ=j&V1M9zcx5bi_pr)v728_3r)6R288|W})&OM|@HbK~Klz}|Xh_A>Os91@S9~E^ z?yU0kko}TJ-KWz(I)IdGdOz~jB;g~yl`TPC_pHtZ_mXnD(!tK~e6`1LmQeHKhCt4X->CpEoIXA7&XNEtu`OAEv z=Ltx-e6v$vW$^kmcB?0i``?j_e;a=J*B7#i!T%9cXGZJ@GR=r8Ps!Z2{_`cq6zW_8 zG~6fA!we1nW)>42Sp27jQoCGBRst3cb@*Gz!$o6;2c25fM5FaAaEJ_lyS%!#6CRsu zF&Y(N{b@ct?d9T zQ#DFMy>xeTBVO-+hwC47YVRZ7A}J|dIA@+N*Uj6T*Fzl^6~<-h;p&=p--Q(9-Rb0|Ts&Joe$;17>zG0h45BWy~vL z_&HHeJll`>d%I(QURCPlN$BA1?Z#7dk^XYWEQH1OM?S33j}=GMGPAJo_*KR{WBW!W zYU$|M1UXN*Z|V#@v+hZW)HP zU2!>7ZA4MNQ2sk1_3tG+Fm0 z&K^$mQ=d%#fQau_H9Mit8%-DIPLexljIZ)+!U$JRV@0s%@fX~Qr+NHm9d582a|dP- zOXqUXPIMR+xYX9cU7aa)u&dGV{_J}?=F!zeaJtX0s;KFhuBD(b%&Mw=oJc1?Qg~N0 z`eEo2b~?$!CZw#1p5SSmYFJBP=;HV{noI6P>e{&!Zft+3lyVmw%en!NKbo?pQL;(2 ze>4BtZCx(h@{d^Z&3S#V=d1^X=FBscd$yBR|6TRypzPLzv%pqI?-S+WBVT&n%}bJM zqT3?xWAgjY91g|KVwi?+7$`K!odCgQjbqHF-=-O%KKA^DkrEmH0i z(rVzvZzVO${<1)cz>RfiPwH@-F{cWWdy_XLJt?h(zuC~Q0AK1f~{yc|ef%oKn9bo5JVy=!6wi8|zcpdWsjF5Td#qPj$%$H4-N36il_ z8>)z4vft6AX#zu)xTfmgloBkDbYr-`)trQ8dFvp-L1Q?t<^@itk}b5%LR1cSm-C~w zKS9_3{bbg8_@#H=ge3PCRqN!3F=X$!iZ$Ed659}y(B@3{w0=Qg^Q#)&Th$g8 z7B$~jjUo4l^J0sa!}?;R3%S`oP5enuPt$m;TNyceUk1bw*QqZqmS@gr|EQFPh$Vx( zZq)i!32a9q=|YJb<{7#C<-{f#4|giqq$~*CQ<8!U9S9KLVpEfH?$)fqGmDeXP$Pb| zu7|u{XZN&LEdlYWc8MxOEsaXFMlL3Wbr zk%7K~7$E7+mXDH?fD(3=Z#YQ5k{+9Cx=)g8p8pw7(n*!srvuOHp!P5VpG7W$U7VOQ z2QA-_J{(OM7JWfm!94CY&~bA^ciHHXgHca5xF#Dr%^9WDY|sNN7l2jKW7rCTW#r4m zbhx>>XEPjSJ&1oGwN>bJhIhBsM!DJ%`@VvA7xL|_5H0oK-w$%VR08#X_k+I^^i3>K zft9-41fd6pNt!${nKB>oHySFc&&`OpJL?l6Um^^NTQ>i=Fd45n1hU-refKOe*t(gv z<0W(cfAsBtbEeg^J5GsXi;T5rf501H@%k-4NuH>buTWsZ3X{{*$;5NWn4kzXFOj0* z^9^yitmf1aPE_!1Vmd2fSJ~5jW$$q4b#qa^`C>^e*ZJ&xeDu*Wfq3C~)K746j@sSH z*OoPe6Afep`jJ~D+|j70@VZiEMT>;T7;6#wy)e1Dy_HxjBbKAq%{LD9?#eL4F^o`H zUy2+NooUORYI4Q);i1%ui5+|kcwngCP};OzgoP#{^JtTOS%*uIPY;yFAJl;_1~cf+ zz(*z~#yE7#?P#LSofGSVa5jU|66Y-*9vUUJ%WkE|Q9a`?EXO9$-O;H{{H2=5^V>Sv zNP`=`_ZSl@E7DdO--Jk5{O{T@hB8JNwSOCylq71$kT@k;(-YP2){aitX&Y#kQVVF4 z8M=E*DpqO!cw))A|5^PR9K1C-%&UPBz)SFfJ@}+2&;UG@mH+V6WXEO{kLS z-J^<&rrP7$4D|qJJ5qi%8AP?as4H_8f{f4ZH$+BRUXU(^OgjAy!uM5Ir}`~-KxKak zZtmLAV)MFhE-2b_FTw;i)^~9Hk*cn|n?FJ)b8>ziRdRn3ShO@*hf7sg<4&?2-y5EF zjEgv%m@GI!lfbINk#2|3XVpu-%PNW+)@E>s-~|@RBSkIH-bF={Y%ZrnizUYhwyGkn z7tGxkHfu7iBaJCc6O5hdJuFz>Eg;0bKanAsooyc24v-B4ruN5_$VFr|Tcjq4+$2yZ zjZTO?%MSHz#|bpsC@$`O`P^U=JL0{=Ca0trn+c0~J8+PB-RsH?qCP$|eem&F z&5%@n%=KKXV~_ifLr4EKnp#jy<|4R`Xr%f14DU@#`jih#opmq^rF8QJIac~Ob`gdD ze7n=E5XHpHslg0H*M2?!y~_tSTtBH1IBao!I4`}%1zY3^32QR`NSH#5eKkQN9qcwd zBp-Qe2_rdM+uL$Y;U*tM?Xmax8u?(RvCzj!0_N&zS^+u*t8J*9s%q@L0>s&X|5 z48jYtp+!#$X0HZT(HI|aT7&JcvP;}6=`GUf5D*YxE;2PNshE%6m=O*g0`dy3dLv^sPFQOEqd$9M!W1Q5wt8`7Wy#WzQ# z9IdeE@_z|SbZF45xfIV9ExetLfS1N;P*Z1ufqxw4rjOdBBJTO$@c0&a-IGgA_ae!g z%03pMOQXAid?rs{0#{oZdgkGn>myYD_V`FZuSm`Z+JX|VyK#YYfg9o7Jh?J^zlNLA zA8nv(CZ7US_$27|gY?6)zhv-4*$iYz1mHbWJ}OBq`u0qp{AHO<%9%rh^JXy7Zd<_d z1X-ul1YRYLPL{X6u9n7R*%t?9Um!pm7J>bcG1n!Jt3O)A1V!XRYj1)+`yH-_=tufR zZqvG6yEe0tCp$!;a;L}K8azg&WUedQOcql-P)77j8%l_tCxkD+LYy0gaoGz#?NkCJ zQ;Ql~lS;h4n@#Vnw|R%EOtgMsSph%%1n~JBjG)+YP}`BM=Cb8DI%A(=ok$`YNIYLX zWGBO{dRN24diOR;$=FR$kt`;+-u%%qj0(zvyJ2$?@`Ol{!htB zrvchuyT&uEXtq9b(yP=kG5&jLf zbbJb!t3ci(+vV7~3r5(v^DBRM?ut#+EI=cM1Q?sSX@II^yT;vCC94zWzOCk`!eHD4a1=?(LF?2Z|R zyo_O78KUN+5fCzG@l*Z==^4@rz0P`=x#k{tAcR+(Gyx+6s?3Iv+H zU}^Za3h)GdbrMdA`2P)d#pPZBg-z~1A-})AGIxp(U)Zk;BWFae)aoEeHG%VayFEk7 z)I}A(yKVoGv@Q^6*1Ipr3)J|Cms1Usrs#Kw7})6ZBYu=^RD&X7V&ZLZgJ9M|tPv>( zs0H&|4-6>t#49qTFWLF|<gkge$e%iZ-T1U6*kYd_ob-|k*Q~&AtE4WGW!j*$w?jZ)5%*I3G+HGw=P5uVn!d5csLHW$Je}#eYK&@bjIoecDn@Pv}r3Z}u)RKdbM^ z$|y*(fDXk7zq|~{@Hot1aDDf#37Guq%D(?{Urmm>;3p8Me};h^qAdN5b+nTKUqX+w z=Zz8nt+K4|J^#aKk$Ib{`LRFXAn;ry>#2~sci(yY#9Nwg?V5CsTHx{7>UmgY(1{H~Bldg2|NW+B_;NlweSCI` zss6mm@^@Q$RP^;*QIGgli2GpL6?Q$qVL%F~s_f}qKk`ZcV|6(G@cfYbe68c5$9Mw^ zn#ZTidFbVx3?NVNsjc4^>+O+*AkRjJR~QlU<4R*=y=K+Wl%<&M-shD{?&w)AxwI90 z#pG{ta9T?q?bJetSffg)5lO`k&3UD@mKr$1PkSmue>m-aRCJS@C*UVzy^cUh;ccQY z7v>-9yF%N7{hq7Fbv!)7^T|f>EqRd>e!gb=8iF1s6C}D9160DFrhp#nNu%rsv7>55 zIgM!Q=i5j4&xT0l7!j8GrSzW|lC9fM1+b6TgseP0Pkk4h#=azuz``7dW=Vj5&I0%s zZt*|8tH}Ktmwo!hELTHN>t3^_c2xrzhe&@i@|T_jQ$6`J(mgeM7Zo5v&2_-2Kb=*us&|XLF2l zpcrjRUAv{!0#wYrNXTta5In5fBEj~QB&9qA^+vLh7%N+#NdidEb7RPI5At3GL;*YUdE+ieUo6lgGwP#fcIY=6vO7rv5mI&=9r=(C+ zL*L6g%f-&iJjFUHPuSzGGF5~_)8LPJ;gaU;wLOw+YHDO*p(I@h1Tx$ih_sF0?kQL2 zut*CjGbF~Il_Fy>t`MadiRfL#sH0p%tF$}0tsFYdfSBv@soXFLBs`Zs4|_S-$o-!@ z0X3^ITuMQY2Vsniqw$KL;F(r2o#j?meeH|GmRQBG06_s{lq%lA9&4LN=lZLmLa1?{N;NkT4?5#^PW8}`i*2Sphqh zNzf|u9^UU941gpC*=)4?Uq`UBcqARP060Xy?fztkLQHhPwP z(eNpx`f5)bj;_&X5pL3UdE6$d3Cu+F2OuCU(U;D_i7RAdUq8 zgumPa5jJ)B04EzmzUS5&>DsfI2*Mqs&eq=9?stAe%|qkxUcmtP1c4Dt|Fdb}edo(j zd(wB46Z2v1m|~fqAd?`Np@H;)h$zxfA;1v(&JGp+MuOS04^m zZ|9&}@i$9Q+Vo0aUSv~mNbs!%a=v5wi1+Z|S9k9Ca^hQ(L1^AOGYY)enk(j5Uf{( zB}mO&$8W%pl{kmy=pnFB=XBD@%cq6U9==G8KwE7IE0A2$3PWXH^1+fL01Y@;i>M2 z{EYR06#`9YjNhSom6sQ|(6b+lfX{^Z5IdvKOW-YSOrpPNmZyEZ;Hinpuf^zDExxO2 z;~_?*jmG7#BnA_QgYgk^&>Ih1kxA8iKRAG z&A|yr8R6?h7KH@m%e9X|NH1W1>f*n{;S=c*UlL>lziURyq99)!fvyJcdV@L337S)q(o1mS_otD?^ zLZg2SjSuD9hyTUeUj@b0Xj`CgLU7k$!95V%-QC??g1cLAcMldkxVyX4SZG`tcXzv; z@6`TlpMC0oxc8iwuA+Eby?V|u$DCsf!dRl%dQGGfPfp_8Moo4j@dIp7t0wWuCjp%8 zjP&&HqQQLn4-9atT9CwUAyC`M40>(kJZ>lPY5HDLP4*k~U=>cT$41UartAxaG zylo98o!+-(VCi+1aqWO}*zxSKHYfJ2kl(mQ&F%HwCxib+wasP!Xb!gSUO)5<){_Wt zJ#wK+zclp_B0Tp6H0>Mg3}+E^1|287DME~0yhOR?E)iCR3~6Bx{xtUa=?f@6xDMTd zYK`yKNFxL=|Jpseh6Lm{y&ipvQs8G>;G7hgw#YF`$3w!h_#^XLCZKzNR~pCPcuH`v z0M5PWFu7P77VKWWwSH_n(~v`||4sl6o#xlsM07BB(_3WV>yb*YcWiuwY_87Ni1a6nWWE?B8neKU}X$yx^vma*1Jx76rP4$fo4r?k`A5 z7WAZOkF#a;dkkKlQlbGqlJw{D>X+7+L+=d+CKA-=m#y{Y-4%O#cjcEBTX1!ZLfT=K z7WkfCQFA(gc6i{%LDSgXc6S_kiHh8pDd~-@v*)>pIM9kN+gA!cB z#KA(NQK-~rsP;Kj*tO4j4d+DbyS+PC#cAnmALm&~U)jbA#jpP%6f_3CkCCRsk1)$p zF^SuVTe?P#Tu9{k8}iX zt2-y1v^y*`=3)S8CuF`*;c8%|z<(~;k^{$&xNctZ{rtV+hYiFx@Y!^HoCL$Q7r;J0 zeT#V$e=@=8ny0M3)z8cO{*70Wj1pnU-e8QcJ1kN7JqJ0<6#@|^C)L?uv`xL5mMBYD(4-k0UBIsvZ%;Ct~{ zGdxwVhV>QS-Gq{zckeTks%s54ww9@W{uQ>mJj9@F?9jXO`55q2{eFxgQN#j^R^9!6 zQDW++FC^(N99~}F-(BLPr07Rv&?Qbf@hkUN9ZZVlU)FIC%sTq~WgUgG^(RCjL?EfN zc!C4*!Oao*pL@uGO+g1!tuE7u{;YyYyf*ILLcj1Fr~9?Kr*#<9x5VAVN?_#zvGw^E zDXCFq?Jh-izKfbd+a*%$r0rc}@2F-e$>u0#r^2GrrAB~jId;p`+@B>$Prn zjkE4|{_eZ9sjS5CR|^Uo_dPqvZvDeWAUZZ4JnEp6iFlk|5wXQotz7UrX6CArB{ zY-Y1KRY4zFF>i*(V$%G+VWrVWm#xF_KL~l=(A%OwBRxQ8Ql|$m@n;fQRyco(#B~ZK5HEfoylK z_>Pj!Z9RlCvI9TJheRcXWs^n4ICGhCohyUGLc9lzJ0V^AD>&IMuwrh-Ls+e4$(qPW zRU0(+7kWTE-3yw2blvJ*TWpY)62N{QWY5m~&gO63>(+%laE$fWW`kO`%|2R}>((eJ z1X@RbpdI@91R>nfKTde>wzG1u;nuE>r!i!@g7fQ4O--fUz_&CBp^LUPAI(T^%3D6C zK0SGHdENZ}0ydG?)>%=d)({)}AewQb(nXx zeVq3E@7OF!>;o|W(_YSovpW~3(&&$~!(xjwXV^{cD5m=f3uD<^?nRx0Ke8?mD+zwQ z?H8f%beA-^j6m+-f5Tut0fQ zB&F-vs24rp&X;Ib!=TV@Wb5N`ZP)W{lr&JNym8S_>N>OfR-krXt`urc7(VTdV#{_W z)G+b!aKShH&Ppuw$mEX&zxeFJX|!8q%)+EBJam(*T;P zfqQ3QFjVIiwA;=OqV)qDN~Uit`m zzV)=V?||*tc4D@}b{h*|b~jU^a$xj?Jg-dyB^QS39Xu&QbD(A1WNztmBUr)>>TBLoZ&t@4m ztL{g602P>+&UHZ5x%Q%aN>(!kq7BxUMLC0H1RmrShii9D%Bt=SxEaomZnus=%s@4| zv9VNxmtNq`v-f(k{p%i*;}u69F`vp{0#Q;}TIKwGeU1ju4&iOX{zdsBGx+Po&GyZw zny3XvvWxX=Ay+$lxWz;mjG?z5wU$+o4X_1 z@XqyyS5E2)3VtSp&K>3u1?H?M5GD<$R=eHmY^}bhDfsF0UuWB=ch^=iKjVm;+|6Zf zkac@+^mB7kKUlD3d{u3-JcICjK9R~rw*#AlfQSBxe+~V18(fkAmY|-DBm6yFX6Ua> ze<9ir6^Mwfnc4YjA}i~Wj1<~>=K9@Gekyo&R#$gv4CWH5ObW*tpV7$JB+kxMTVOyA zl9%4v43IX(N_mNm39#S)Gtj%M*2b}RVb*v3>;fknr>7P5qTd}$S_9k|j!*T7Ilk)h zdrM#45(tgy(H7A_5bZvrG#BbGY;+38o(O!iC3rhtuLdNjs4YH-!>;E(SI0aj<8=CK zH<;DW?+%Pk_9{FS-151Ki$#4|e2hG8pQT#AZ{YQ{Z`HtqR(co%8FT&s2k_+Tb+frz zaf}7XiD&*+S`rtFo(LAW1n@l*f>$RgYwhb_%xuM6+}*}{&)-ECcy9}JfxVw`F3_k| z8|S4owPI~F-$+_-_UuZle#4sbTUv^Zr^!6!w>lMc3YEDCNyaFojzn>oZFF@u-9|3# z19RVwG$_7tjI*y9mp-vFyKF)plJ|c!tWy=@D&^ETnQ)boULjP_9_&m$wSQXu5Q-A@Nj0EPzRptMOCvJ z_JGOZ>1j$33<_St#xD0dv+_Q+c+I%UZsWrGDL6Ta*;Viv?7uAcrU-kbZRRNVZ?KZF z7P1eTc>PGFxHV+qSO+U}5Rr~7$q{(!8^`BCU{lOFWL{wmX5;wwmdYz|dPTeb`bgQNB)R z!+W>|Uer63cTK;2B&#{5A(K5u`Dj3Whdso5cp7$_qF~#QO8)0et%q+ z`AXWXX&i)EA7n@g=~Ao8!8T?+j67ByOOX2aOkJXxzX6|25Y>7x3tfx7T{9IxpC|@4 zdBn-X+c3Tm-Y7+7gH(ugNpvkC;bU?MoDUeYSs3lpaZPmOAT6(-Ta)|!<@d{B^5^Ie z#`ENnw(VGf<<`#pp1#z6&Ew5wdhIk|=Q*FLM{Wy&9U0T3QxQz-zYz87-B_M`;9b4J zpmH|sejAM;_zry*JV`gxUOW&|;-54Q)xa?MS9iZ$U{IEoH%rKC=xYe=!k5}xW4){m zKrroKcJd1uAoTLR#Dt;R+-wdzufMI@ZU0##df#bxDyUtzU9dEHk2$R#MaX>=R=f@2 z1W}!JDdgyRr=2J#^b?fC;$9Ad2}G6{UAItD;K zfupa_)n$3*bX^$+-M7n}o757kvaubUE0bWCl^5oprGmYm5{{8v_f}69P_)q;=s|?+ zT=e?Px4eUnKfD8qzDDO{CYsv>zQWv>w_wAu*8q@1vmRAR(xd0-0WNL({<{}`z`oW8 zp^N70!HxGapXbWctI3TH`UTJ9n_=O%u(YaViv_#H)~|M0kr(qvw-~fp_*lDb%SoR0 zTub1+*wNp;SS!C=dH|$2>i6TLMEFketfU++(j1<@ZyIX2ps;2#{2FpM%UX>~$jb?b zJ>(eZYh`=2!dD(`yCTQ=Rb?ntw8$Y|i8}~=-+*=L6&`@R~7IyhY$^9b>E?S(> zp2E6L8K{-7&VQo|&2mA$sB5JPc#nWU1YRytLi&~HuB;G8Eu>0GsFh^#`uDp1I(vHI z8jl^<8H5&kbeOc(mSTb~@F7B5etX{B9f{FZyL%3?ZP6 zWCwg%k9Kup^|EYTJ4sKk76(1ea90PIUSGlpnLZ`BcXm2A^cqh5=mM<0*XNF}vX!f0 zav1#N`GlZm;xN3Ms)OF?mS@vp9rVTDHnV}%YryjLGxJ9{CGHFFt-balDn6wno}V$_ ztJF?bqanDim#d5RpbJ|hU=Ziu2C%!y>&GG`sAAFP_>SBO$$~VT91I#gxHc*O`_B1a zrThN_f3j*0vBfP==_;ZgPn_cQGJ6uX$`445KCJ&{XW0JZMSX@OyX-Kf4xevZA zu(PYe&4mllft?{WH8Ya}yX0wkujs4R|I}OV+4eSOTb$v?1=A)nTEK%y%%kLJSB~#RJ78o3gE$P>_wsnHWhzJ?+;^3L)av2H2WDDktDXORuUlZ(<<@Se z&=qqsA^THYEybOATv%Bv(#Abs#UXorFYRv8esk35p`cM6xg9EHZ_$i+;}Pr(wTp7_ zCYV-y?AksBoGmdMB6pWOdqI{Ol}}qw^*OYmNlYK$LeEyDp1Jh&vdt;>>L1m9_ox&I z4s%3`x%=fy=xI17Z(9(SNQDe)C7eQCA$Z{<&OzY(pDiN?QK=GE*pdT_hfeu`_AL zMb&GIlxoEatD1}BrexM_QQK{6fqD!PLfEe(a*FZpV>#jS7w2!Y^Z|1IzB$AP?)uzL z{yKh-g@5p~y7ms7vQN9jhB*}@Jh2Ii*uLbG{U$HqhF~UWaO8XXMSA1S$M=|Hg;KQx zV8CZ*!5dtMasc7DVkjak8_iqT7olmV(Id0}es>kMx9dzjo_;udc;XnDCiL)m{1t4q z@TBE+v&+X1i4+okOT8b220oc!26ev84o6z#@_o*mIoxZHo0)MpodDPL4fm}I-C66W z#1ma$w^*>>!0S>a$_NH6a14JKWxNSPV#2lSK5R8rWp%@%l=`V|N$l%E|FhjgvmCA9b?-04g) z|HeA|nCt7%l{&`&b9df637nashw;Bd&~gKqmoi8beEDf;{Z+2hE4!NeXxtfF(#9eh ztf7`Va@nlJTDDU?cy@9>kE-m*)0H^jIS8=^%D7ur&ExdyqU?v)IE>mKq`4csm);!p z7_>W_dlM$d3DinUeDXl4tEs<<>90L|e%rtZ(*$Jv;B|BRsZzkyMXZQ(IJ`dlUsn&g zxfd6Vk0aM{l3nn`?++3Jv-`qtxLE=hRfW1;q|QXG235`T$d7l;Gjl-NH0~qv?SPm% zPHrtL`Ro*gFyu#;?r)b{Ub>jox+I51Vov4NdS#CCrQfTtj0^J3?gRr*-lp8cpk;I{ z7r6DiZyy%1-vp&ozcu84sV*P|iOL{y4@5iqK%S=K{^yeXU*+q+OjZ70d=f)Ka=uVN zq80erQ^o7FtN(UtKwo5hDcX&`zOy+yW&hu!Euc8emWelh@ka@tMHtQy7o_ z(3r%mEYn~|g=`@MK$*1?pd7dP(Q8!>k)d&{WdI;RvwK?f8@T^2el1W#d0aLyH|bjxz|&v2B+#B zKY;2fQGzW=;@e%1)wvu&!6z%t0I*<_e}mo$N!YV6lV*%{~w3G7={ z#s>JvIyq6A&*KHPPtz}(AIOW>0dn*OYZn;xcuA|R3LcpZm==t@^3vb$C8gX3h7f5F4UNT(nu_+TD_WvH+sR zw~Sye4>+~9_VwoqLf#7d;kosnV-P*uc|>aQlY9YN0mhZ|hG3SeekTQ!_Ec7fpHxhB z%G40;tV_Mx@=veAaz5eZ%;&?Y;OWHpIo z|A6^f5#sq4bQB|g05V#!Z({8m$dmt{J%9if+yl5@q${>t;9mNhG=^bU9Utjq~yFo?qYS(wrTM^*q!ITar2P8yXtk{xj*wK z|GqDhxG5Y;VlL?Q#zoY$tosAMAznmv6_tjn?foYe zjt;&z2U4L{=KNM%QaqRD8U3L_=&P`@NH&}AQr6ofhXIh`Sl#vpfoxON5A1qE3a`1+%&V@)U|4-p(Y-3>`1J=%Bx^&A z3VucuQ38XY=jyA?^3CUDF&5633Fm|FRzIna3uk>PC^TzrX~)#*gd~`wNm2zc@zK1S zvgu2IO8}f1wrAEDmXs{$@YCprpZQ-)e%qw4wiDAgBl2hXTx9RM(^48ZPyX|e6(OVr z;ix}S{QCRE|1bX7T&0MoU9f6ahBP}qK92cS3ELZsP4|)M$lZ}&3Ae!e;lgMYZ2D{- zdwg8oj*P;4@qy6$M2XCXcH0PsvwFH%F4F<*luA}Zo8Nrpc{zw(YxU`wJ%~`-F7-F}&SKbik z!40rUzidXY;dI0KRv3}Eo*uzhTH2WKs)xk5Z^pFa4w|B4%*C-0qJ81-(w_1qQNm_S zbLLB*XEt#5vr=4*C|B&7!&dx)6q*LpR!#$x1vojsAMF)9r6-e-_K;%I9ruY0gisj^ ztozNd{@YWeQ-xs0h!|OscEDBAi7?tE73p1Y5jTw%O-~_h#w|LBzwkC)(3a4#Jr8c6S zk(mLgzAPxdL;03BDmCn1(0cV4Y!flZPfa}09y&jYl36x1+#ANfN?u~ab1SKXf;KcF z3nW$?L7G&)pHi?sLcTDms+ucmVN-hb zRoTcD^@v1B(FXpj$9hBPl?XdR{hR*#s$3JZ`bD(P*F5GDG2~V8;{!w9(+Wf*l6h$FzIdyBLXI1$= z!4G8Z;gTi0MrRQ4{9THQvZy4by_yZ_baUqIzJJ>CeH!oXg{Nkg5c~GOOW-fC(b2ao z#zYlUX0=aOi$DeO%Y>4q-reMVQbE^D+di7o11OY28FfY9+~mEsc)b?WJl3*o+^wo$ z`e%C1K=E~b0|`|F#0Ab%+vUIX=e}L6And&@udc)hJkPja#Gv@hcN}m6-O_y&9@E zcFI(xGdrUt*;Z6A=hE8| z>gf2mTlB}_`p=tbOPKF4OKuSIU2{Q08DWNpV>i^edoO+y$FHir%9h)(=FE>p{ZRWA ztOQ)qg4VR`dhXx2tvbHIGrrktFt7e1`y*#&x*0f_xrN}Zgyw;y?{~rBd7P^<-%tr1 zNK&!d0ToabH7$e$QV*N=+~JU*@`uuA-t3w3_8a_I&0KRgp{TAOpzu0MWIWD{47({9 zS&v`%#{7YVV<#$;+BcuK^%0=E(P9Mm_Ei0jXz&EE&#P>Flnt_x4Fw$Mz7C%L*6)Bl zwrfEi4&_F8Tc6{bhau#1(CZ+?uj<0t{Su#WMkIV6LCJdR3w8P3X2R*3!h`citJ|Tn zDuWKZzaCrP7sgovLP4Uqxh`0V{2e&60Q7mP4v#&F=Gu;0|FDjOS=x)exEC~-pR#Wm zt#e$D9n9qV2B5L}Pi)fv;}`M2DcpwgsMK!sAzVt9mBD|DzacbS%bFbvQC74}&i6Aj zskGzYi;*=p78WIFA)SZCnGQ>4X?d+hP+`PPi%r`oC-8X}M$VuBp#5t}d9fZ=NYSL zP$+L{09Byj6C3>OiHch@$!GjPz_}UGY*fxViA$aR!5udmY%1}@n=!|};CP`|tqaY5 z6AeoL>7hjAb@lx{r-Oq*)~i|ScA1cv8k_N!-;Fzm$?g^O{Jgr+aMkOH%zf`Jy-9Z? zWD$kbom`p&As+U!cK*TXk%_=;h?$Ix68cvW3E+peXPC{)CnfbGAq$Dc3G5w*Cz_sP zqj&rR5IJ#7BR!qnO`etKmncp(Sysdwcgko@`%uK$`PB>0?O%Qj%=GZE?KBc6(zV$y zii|)xtuJ9JkbyKuGV1v%TO{6LTMWkSYa;_*hb6dMZ@!p>cE764F48JPs)JuId(e;e z7FZ0hmYn1dRnomt;DM!6{7n;7(TC>CoUH z+(gd7QMy-N(#6GCX>oqAGf>$SIGH9@OnTKGUoDcfC{~}dYZQs5-|RSEIPQDWLwi6- zcjlE@U9)kv#P+SP^~z+?w&Q+EeR>=J;sTF}s9(g}fSt6?qCVG+y@gLK;RvwtZ0+-u z%8?xd8m7BeRp8)%S*tdtW^cL}NY6l!)I1nItd~Fr`D%2QeNc8DCm&10o zt6mB@H#imx?K|CX-}QN(dbh`P^7=DW`THwPHt;}Weqn3&&+)~?)+d(r*vFeSWy6US z3k!tGjbDHS^B2{5h|eDaOnlZU0P#CoiO_$`ys>*BI>zpG2xojf+Q&GQ!|;yZ0#~{eyU2Z7g$`AE zQwwS&KA?X4;pQ%Xswb~&gb49I5s$62b|pQHI4li=*oAmD)80F#1t&(_ph;Uv{Y6w@ayr@T*~6*qS#>&);FkIc&vGDOMcn zx?48JyvRPShQ06!52;uD7C$YsRvNnQId)QET!6wpKHB`Afe6!|zL`%VfUC~ii!dq3 z8=2=3{K@o#iWBSmrL7rshaHMKly%MZl()l=AhRKOX4L0fdvB^LuQ}_f4+|Y8@T=t_-B-W8{zzd^k0*JAzHkrib-vHhJf0DnHZ`Dh_X#RGCP=c zSS9kn#>|XDT1JNEM9ml^)}j8QrkYHKgQ$Gdgs5MQ4Hr2tO$b+d!V4fRYX|4EY>SAR z7WtsfBZZhEI;V^>bQR3}M$5f@eicvFIHK+vumjUOi{1VLgkA?E_4IFr$j0s8XGqDC zb^4jQHS|3xmbr2?kLYd_i(o%caaq)bpGCG*!!AdDI7=XtKtw@XNx2(Uwo$J@CDE%! z`}8+H2kjASOZW19{k{u$k?euCp7InGUPC~x?;(@%`ubXY)+as?6%zE{9$o+lb|kAv z{tj;Ll0-C&n`=WNSjC6@QL6qtW1vS6$LJ2BK$qx?v@vyJ;g9l9yK4H8Ekn~w3lRbI zLtNB*M~-=&CLetDm>{`^&9z#weP2&G9ba&gq-!ku)q|hqw^UUyLi?DK>#Omp;gmR= z<9rACMHd0iYO<(PWZIPme?_Ju&tD1-@i3>LR1;OTiicFe68& z=cM`k#p!twu*-tM(2eqt=-^@eBhyCLQNGalIP)P!vNou%FP7D!Afd~ba)?GVed-(* z86KO5Sqc8ojfCF?r}hE41^SpKO9mX>EDnDOHfL&1?h3*L?XFTHGn6D>&Y%oNPF~}U z5s#BAM(^f)J2O7@kGg_8yHl3%!#FaK2ZpU)&Q~@`j3|eUhlBz{s!jx(CuljzP7uA z?AI?Aq@tEzo(3&Silk7wuF&7k2K3LEmrPr00=pZH%>njl3v3+! z+jD$^l-V>1z6*AE>Gr!M`(k6Ap$l3V;6u36ny=I?xaECG-(5(KAbJp#xlZkWCZc#(IbnTVY<9XGAi+Dvk* z>epcr5LyewW{_mY@5wxTqmQNheS4vTV)I*qqA5QBR1y%4pnsIZ{g~LrGMIL&@+Do+ zn{0DTjgVQ^1+1=-M@DrZ9#x3`L`5ojNdyBwC(5tRSucOp>F&516uWQG=L~bd66%>& z?YoA5u@2Ph`Ke`Gq1>Trazgy+gJ$;};z?wjsQgJ-lZ83HqvFYOq0jF40H;!Z3bd&R z@n-L{zy+ml-7AF8ySIR#f_qwavb*O?3ST^6ue>_cdXTgMMgA*e!?2-6x3ftz0i2`UV=zfPXyOt0!^kQA$5mMct%g!QZRXRZ^7sP zn1wOigAK&*d z-tx^&1d|*e2dBpoz9fS29PB0LaJ3_~EfMT6*xUe4okZZ{<1^PuhYkCi80Hn8UIhy; zgFmP~;ATd1Tf6jA{D_ExaT~J2dFd;qMbBMynl(1@F1B`+9#Hu7l-b;gOFui(az%DQ z$(Qyo74{kWBg{U$Qz0}OflXiStAbL^9b||Z3=KR&izz*h-+Nq%Nx1V_dXwAc;tcDv z8?LH)n&FHw1H>E2K&Th>?_)v#7EG#4V@}U}Y<-0fv_QI0fp{Sa8JMTGOh!SaH92ct zP3<&64FK_TX*OoqZC-I5`tC=fpAaorY*NW| zk-sYDJ|va)$3>w&->7%9512k5d(sc}kB?Qmy0j#O&NKAYYvZUdv^C%jmpA;wq{T8}&n+Pq! zm%EUIVbD+Bp;6s{mJ3HA6rOjEe?7^*P!a{=YC6Q_WTbo*<%T*%6ZTFrOmMlBR)by;Hk5EoA&&5 zx&s}+ClxTIu=e!r#Fn3jG^QXfs{gc7yl`TWNCE*4rkHv`QxZ31aaFe1h9BFH>zOB;$&AZlTIuzr!nlV#yDfq3{ekHF2RR!alNEcj3dzd4PVw${bX1i zB}WwFY+kHMOj=M-KV>i4W-h9q1cyEUuz+=q}ASCkTV>kRh{V#$lIW>qm(O>gh1fQp{(m3>7zahWwELdLgKihp)Q{T=o zc=wux(ojobw0G=wG^3_l8N`0wCCdXZ-|=b3C!b8;lVJ!RlJ0ebhTUy@^xW4hpmSn( zj|cKT#REbS7()HmoXCFBE|(34;tX1vAj8kgKP2hh$@zJzbcb&iNIL5oz*Ffj2JHWg zjmxaB=z#El2yoxNLh74QHzZi2E*(B-aa_}mNSZK@F~rf+=eKwSIUT1k@EPdZPLH8+4UQ8-vhdOTtV0d+kpBbR{O2O@ucHSV)7XPO$`|V` zP{0}LM#1J3cHrpAmV^AL8fzdu@6$m+aV%-s@jVPRb<^r%)M9n`wHHkdtt%Rd&SSXZ zStt_zrki*4d9M%}>+$eRfrQ+e=!M2IbzftmTO?@*X$>v^R~ip>84?||!xZAcCO`O# z1tm?6DbEnGFB+n5MfAOfBRkkzn_vYK-j-2mCM>GVis*yJm5gSi71lMCCKbnL2L0&S zS><^k5T6~SAnG}&KM=%59WVoFy3-h(fVSAmv;gZ&D-QiIHjG|Vzi^H8gk}A>6C2lj zy(~kykL0$#I$%Rsjvin8x};{Z14fcZS|VGOn2*+#T6G?v-sMy_rp8qD3NyJSC0!^L;iuk4fEbo``>my8tj_y>DZO)77vD*T3IPkYMfm)MjSn ziF4=N7GWnB_~XWM(wDNIU-Jdh_>%(hawkzj9{m7Whlax$ax(zRe;Uak0^tvZ-vAAA z6baRA^2tar@9%OKGQ~e34$*Hp}U1{6WO`4N&ZNsS+;F1WC1#5bZ*N-GRp4&18Dg_Qq&N}%WGlNigCPaPEbgYbFxnln$= z`#^t^tCC_@h}R@NEON|_87SoQ-nRRj#Qk}1Sl2a{&!aDq_y`q4Mph^B{ZcOfHRSrF zx3r$t7D!i~(7M}u#_S>P`7C{A4DkP_A1QO*r%odL?p;;|*WBU|!P2>?SeF6Bc=Rxx zCR?#vKCFYI{mip#M%AJR2(Io8d9XJ$RJyAbC@&~TZ$wq?%It16zvN|3+;8@0YzjT9m}j86LcLk=RbtKmS2(JrI<{5Y?opw4i2YLanMebl}pGC8RF+ zpnkH^>E?^#UDFOm9y3~C=i^>x3~B}Jg}(pmt@wlbfDwf+ILH@s>xd)2349Dx@*@o! zENo>YZ6*EO4t5@%SFE_Z*y+oM(JHQQy=%t;wlSL!tP4L`<%O@^h=>OW#I+#*2-73Y8ljedU7hNk>{ z2+|W;P#Z|+3W_F+R=7(!c2R;9jjVxI2CV~Y%h0kQ{A1Lws-5zxDt1H)`kt5Bp)`Ya zxh;cS%ko_3r$_tVVP15iO@bHZwhoH8xAB+{(0o3LYG) zIpmmMMMT zXnN{cBKG1=HC`Au9GE*bu||HH?^;rHKNv~YPpNZ#b}pBzvwPl2EN+Uakkb32Y*1<{ zkIHjt^PbX(CQ!%bR%2!Q$I^yYP6@mYYJ=6>w>n$0@+9O(ur$=O8c59D3f{t^<$nfV zSs3u_OaK}6AejxjlSS8Z7|XtLD;}N;F|P)_5yJP}d2_<}!5`+K-vM}kSDPEy$mUxl`_OqYj>pbXxw9@IA6??xJn(AObm%WkIo?J!Ub4xUySO`6ECm4ljdH*I*uc4Hod?T zO!%a^b5&rMg0bt07Wp!CnB?clAWO+7NtxwvX`bp(0Bb&UJk-+6r6a-JLKfiZ~N5 zHH^bnG_LJFlh8I+y4>cIqO7;}{+A+!51$Tn;Wm68_&at%N`m)20X$_)75S-bA0I}g4bO5o90&dLq8P;7!0nb34Ivf&+T1lG6=bi!lSCV z@?ZDIHWq8L6)u6oBY$+7h~1X(MAA1fM20^_iWP|P>5X+l#2#~{E*W+9x_w(~pJ;3@ zZm8Jw8bgrY@IC1bJVjvgx!UCaa{PT5zKc%H29>GWADp&hTt6B9D$LWB%je`EkFbwC zX#BwajJ@Fx%Cp4s%1H>aNX?cOcqTf3;EHv3-DG%N6W1rqs=QF1V|p1>=nBK2^JWhu zEcv`khRO8&%J5G62FzR!<^$tk@3-%Nc0l5@sbespL6f7SH*i0GxNJSyx%TiBbPu}2&fP)~qv7>*VDP)x z5(okGH~YaO-tJ;SY0IzM@cTA5=x_mZvcCoU1@TMN#qsNX4Jbw9Tx9YFXqKp}Ojd%| z@4BSKL2+Z*{5OS_=k)Ylt-jY-8rxyrttRwp^}pJZp@lu}a>C&22*#-~Z(>qZRecfz z2M9ec{qcn5S}}YIP@Z;Yx)`1*C#My_mqA2qpEayIUSU-v* z?=*G!KWirRtsCMD*HY5_AKpHJmni|bagfX8+mDYkEMQwC1(9wbfVv2qPoB zrxlEJ&;WdnAjr0M8ba}pS~BUWK~A_s=q@Q9Xpwpi-_gc0sHR%)M1QLf7*ogvTXWd0 zhI8&)G}x?pfUlvVC97bkQq$7#dlyevn(>WvOLeF*^EorXN$;Z+*mJ|5RYJqpA}=17 z8?C{OM0r~QM2_f`Gi#CKITQ}m_qiMtZ&Ba-jj06wKM*fZ$1>MOrrk7$2MvTJq!W=u ze2NMl&t6hGNJ;5j6PhB3tL6=k=v*<)K?;y=MV;VJ&$TSF|K~iJhc7UALto zbG@r&c96`=nDSWjwp_>!Adrl>&&i1n$4E;H83tEuA_KKfX~9^ObOAjB3m-1=t8tav z=JE)%*inUx)MWVbn#0H>!)y@Z5`;t@i@K_T+z3s7^oqi@W@;iu&Z8XV(pas6#eSOU z%I^XTWt$Ck=T-{b-EJBxj_#dCZTON!tzDhI4)xOHeG?z`HubOl@r}&4s5<5P4O`No zpygBr@CH|I=7o%Qi5OyNA+=$&Ebf8Pua(uZ;^*ZsFKIGuX-B^1Tb-@E3ZvrDH^SgN zHI#DH@>tR*9`0~=mHGrogsYLJD)4Kn=`|$y%Ki~NcKloBDsQgvQYE| zT2w^h5limSwy@3UVkLBHAq5NUpRsqwgKbtSVe5obg8*;I{(R*dx3HNt454t+uAFE9 z?18yg=MCV=gR3NNxc99Td#0u4f@H|gvoP(|Km$GCE0qmX)gLi%!i|m*Px1Mu1Zz%$1*Q2NK))hiFOP2ORZgU zvPR#QmW{`;RKodhAm@LwEPL<)t0fiAMe^Dx6pXZxvp#k2tvvSqXz~#6qnY|~k%mS| z=~FJd$SSah;O2;bf4V*z#65kH{WJEF*uHkgzcOivWC`5(ZLRZMY?lxX>oglgY_#t< zVUneD>YXk-UqSl4y(G1G?<1hr?i?aUsG=(nEyvLUZRti%3!d*WO*!<$dANjb%Gqtd z{Xe9AWl)^$wq=3@4bY?s4#C}ny9al7hu{$0LU4B)CpZLmhv4qPodz0*#+~8&?m4&a zoikH&PtDKns(!m#o_FoF*IIiIX7bqqb83S=UbAP@HVrvFhEl(J9GvtXW{7?9*YENa zepZxukACH=u}Am4yfiT>oRIi|h>A^?(F*w!hFdZx(u6jK*o5mqJ3o@mcflp#3bsbM zel}UkK02Xa=)e%&Z}r~n;5`d+^QpqPn6VMVQ9EgOrl8LUKj5RUzA`4gP_x;3lP&v$ zgWi|c3rLe|&&RftM;VN*5py=e{LbeQ?5uvjs?HhlF8KE*A8xx6Vm4lVZqK{#?R(DC zs&BvxM92z&srE|#TYNHe`omhROD;kZLb+b3hF~j}+p*_c;9te;oDAP_g*tGN>k z3ZIUyTNDuA9!nDcX3Fxzn+DbOtnDV;_Li@AW3OL?z!TetETtVEu{C5UtTWgmI$td= zHn05UHol%JlA&N`hmqvry~U(KcxQ^hCOekCtNvQBf8!jekWptfzH4) z$FbQLSqCH>sMA>9pIn~ZJHkX*`2B>CYw=s#&(Sf-XdwaD;KuMu}k@a#V;8ieNR; zm2QLc((AvW#6+#>v<2gB<47qAeICXvH}lfoJU(jM~9S*GKJ4I z$airpqOouT>M5r`5uKQg_)R4R~W>`RPSRSyA@KVinceC;bbf| z9z*Nk!KnB{skU76`Fi7J%!Pk?5byCebw(Niqe<5@{S+N{Ln#G`bOm4d^OJz@ffMl( zEP9gaiW=9=^)dPGB}H}1TM0TSP*eMnmcM>B^O*14H{0IhS%FRx>4pXqID*f2-0`&Y z6)UkiJM*37yAB=n#zuLjU zfobv7-LrK5*>3g*)+a!-zAH?8#644wLZFB2h=(=H#N$r^%L(q4u=?$QY-ntDm>FR+C}0;WPaYnO{Oy5mh!h(86~q zy&Y7JIHxm(*N2$jMK_v!S_s-;B_4hhQkV`yJ0KKWxQVRd#dU#Zft{37=0doNnuze6 zNRG#=i@=XxcK;b3z`r7R(&B+rBr-&jEg((r$P(j`ZSv!Jc^9;pP3JX#@9|m+|o1P7KGsyUnMVu|%&X%c+s4b&5wWi2PC< z`A1}A=Y0}{>+SM;WC1!4BiX+8BCV+$)SLX9Dx94}_8qrQx0-&uVqDEH=-HmYR{^bJhVryw#=@D# z#ruryMKRW4=OkeO8eRFgT(+V!K6^N6bFy5Ls78dk#p!qL27hHH_U0bE{_@UT`tm%4 z`0n$#PDAd-ZfMgwzQ9Y2#nTF2WjEv=+TK#}_T~Kg#^fotpN%==XutcRjeF z+RgXa0~;6WzV96Rz3UtN9m_+(hXLru8pz@0B$G?Ni}HQYhgk6CF-SisX2k)8_D4=P z+eb@}{B|tAs|y{dlm8YDd<(;ZY|PAKF$aTwIJ&MgtlgTYzehD&=j>>2xZ&|D^dYZ% zT)rKwH?9bDzDj$FPUH5xuBoLz=YSiHesidXp3#shHwFh6VBwRS% zemj!!Si8LS*Eq{7B4QhXW(n$5yTU$S@cVf$x#djyoYn^WSDNJa4+;lb_E3@wk(Qv1YlBsPuUlQ8 zj==t3+HDSpnV|!P*FFbKFOP(04@*TWM+~LoqMy1Nk1eP#L)hG%259)s2f?9GvzMX3 zUrRjn+Rez%=d4^l1XV)9e^7&@REQ9^yp;sUg^|xiI@9fsM;zGDIr*eIs)!*Q&0m01 zC;FF8%nmviQsm)4t>mr>h@JzBUGpZZZe4h%s3UVuV4ScEJ=cT8s6z&>7#RmC&1W#jaMdM|3Q}s*L%pvJdJHdv47!#nsYqm;}z9Lsqn&>k{}o!&GK$52b;T! zBI*r7mEX5xajom$%GkK3S}_ojnZLml46wAblaP@aai>fxgxh8JXHp;DM#1~{ftJ|~ z(fdb2pfz>m??Z!^`;zuDElrlM1^+3Fj0*V2ZE}DU8Ma*ix;j@Q(t>gFhk921ZLaRH zN2?ahl$19E7*3BR1bL*Fv?eM=c-;gDi{H*)4R_BTY{`<*hiPeeHY-hlbWVGT*Xb=Z zrLh+xCvl{P)+k-lPvq-+?lRjA#6CVx#g&z8KN^hbT<1cxwMl=b5*ArPK(@;kcH9km zLhdC*Y`-LYPbjXtF z7;#B=aj`!y|&RLoi| zII7+!Gx0IfjHtE27>qfk4Vc+!d#enI`|S=LKm@eAC?ZX|57HPAc-rArZm>)13ZrkpC$e`z+Tzx<%;&<#y7?Csv^rueb=xKOzJi_^QjKKJUh z7jFBRg0wQs9Y_^T(BszeC_c`+IP_eGF9Sl$8J!PiwdY&`n!51P>RC!W?c!N^8%6b#AXy$ZmPSb|Y<(>&@r)51h?{u;{_B+fn!<0)J z(|apVMy?a=Zt#XdQcIsnQGH8N4z?bK4;U&=r934axNJRDGZ9rNdW@JXS#>3i{tGX2 zZ%dWm3oYNFj9V&44=`G=SC&p3gR-MKTV9Dyiia;o9lP-;^bMEVU$B=ugP*18iN(F0 z<-q8Te&Yw$ordL+>uOsf-xX5t!!2DpS#Wss`Vjy7RIXF4?QT)klNTDIJevLNk*C;w zQXms)bHD0y=pH|AI7izD;7LJj71@}`;&mjn$K$*5cJlS7E&;bCxg6a!Vtyc;eAsWs zi&o4PI;#lV6|Ja12<>g@OA6_4?CMck-!itZTY16^f1k`5nV+GDG5W=Y*zKMw|H#}i zS0Zj7BfjRDE>A>XJGuH9 z-*+9Ad?At-qca{N_M9DyeagaLy7z>>oV1M{C9K@u)#;B&1x@HQU@j+DFn0&(B-5wY z6=(8^2`sLLwP#dmN6!yX*N{b;v+1_`et3RnIQ>yaXVByfxww5;_WRK#C4Z1PVL{?Z zYI%96@PtK+f)Vs|=GOVOHy8!#Rk5hsY)97d>>p!FECI3CQ_-MWgU`Its>zlxE`f6K8 z_Iu{-8f^ZB=HV&^Ab^}$Vu)ivy9czvaOyt=RZ|_p`c;S=% zo71(RY=MWsJ70t1^azcLF39>FLhNaW2|Qrpd3o8F>lKFkC+1I+XONBFWn@PD?Z<&d z2yfAKfD?G&weM0Zoo8xtwGK#nm9cr=0>-eQy1bX)T)>sjSI*|Ye-LtlKr(qme2x>a zDivEr0#L7F>eJMk>?pd19P$uIB4PCAC(MzJ)KxW$r zdL;Y#>VdV-wu*ZF!v3AuYsTTL8Ljb*zpT4Cs8(6#pLF*k@;m#Z`48z*p;fr=pS6%O zVBwIldSBnn+0bI5mC^xq^D_#hkj5Mf+~)mi)p6f10C91+VU%iA_P-iu6xGz&=~a0% zi?{XDqzfWL%hH`+hPXBMJUI3FZ90v~y1OxZD}7GKHTvDH;{D3Lg-t*d&SfR3|1|1# z?o+GyjJ}7#1*CuniZ6FmhY-()nvIoB=SGZX)jpVPdH7WE)UnnqWByJ+tWNHXF5{{L z*yabJwvK-{_5ilk@{Jg9TjU!KDZmyEIZ`?*2VaHU(dTX2){;Wfi}$9!Tw0b;Tec1U z1ShJH(i<&C0zys6^CC0<#E#F9@{Jrxpn~QK=~W~b4SzHxx1{)yevty$+{arYkvdq5 z(NhG!i2qUOb&%65pqc(iWrk)plxC(gk^w~i+}+%dGNa|Vxn)Wy4yU0l?04B416R_7 z__;<;YnQcVsjns5+0^&cSB@=#@)M-Sn|v^7YH0(P4kB17)#j}^kIUUCSK|`Ik^5^gW7o5f zEu$rOmyft(A_Ai%46yE`H~g+y2;F`mt|cQ>DEI=7;sYRq&lTq7YSuols1#+EU6@`! zLqgP+DVgIk=Z_mE#Tuo121|=GzTS!@Icyvtlx_I*Ca-QfNRcAQnI?;_b+W}e^sKpl zy;c&Yay`*^Yz)tanUv3L*GNo-M$SB$E@Bph-~#M(fhPlo9$Tz8 z0mIg4QR_T0Ow4Ex!J2J6@NU!r{#Dqv<@(>gQN?{xLY)`g)DGWmS=EPw(N9dSF)u64 zhUz09w5+sI-MNFH(B~dko;#z@)+1hNm+)=ClAWihMlt7?u_m!W_1>LD^ZmTM#5)n- zc)=US<&0h7EXP^q_Q1C8wwo+tZ#o|bbxh}%{G=We?*bLH@Hbv@2hN|?7_Po`8;rEt z?Y!}+m8TKx+oDN644V-^rgHJ(reK~RQD-1CZkc=H*e@3A_M-4s%l;nF-Rz*cokjA2 z5IL>lud*^l9j52zIIR6()yr7oYtBC^&5aC-*v7xk<4kL(8kd`=$9OPj=YY)HDz&D_ zTv5<@trb-Hq6e%xl8nGgicHy^7jsby*+#mEHUH(y{<4j9yFx@?S<>f({3xD)L>9TY zG85%2*Q*I9G|x`oA3yvx@g2-7hm{lnsz;D-A$t1YL`p=(=7xg9s*t*Gc*%8hGnGvz7KGFR;nL>uII-_T-7=;*aW@>cwd7A z`*RwS*`~)OdYc^xdGJ@l8C1CZF3<(c@0sq-hwCr$fF)SakyJEJI|1~U>u7W#F~$L8 ztLN$SdBK;rzU|<}YS~@!Hlp>SQ_9W((XMgN@S`Nf?Fsw9=lpDvClmndQ9h0bLZ74f zr^W~o0;%W0A|rFe!5Fx7e9)#^dc%3`d+S4NIn7vai+!9u6TvEYx3iVU<1Emwn1Mrg zIJQ+4MzjiGwaw{RBHXTG;BG{thFHDd+2P3gTocjj7V~#pGzWp5b>GDR8m{p1^A~se z3vOb;?8-&?tQiCM8)7_`*=nH?w>*WFd%3Je?>u4H@ubs7rxiQBmX**wJFObjq%KTV zIMHI%piwvP2YANCo$1c65EtDJ1OA2=tkp zn039qzOnCP^KxBGcXn+ynqpnKNzy4Q@LgtF{4w8A=sVoOQO-x4W9p|bC~uED4Slro zU;|>{DwsN)sREf!`J+LuCnBG}B6)v|b?KKI9;R~`W7hz;$Z!~{Me(i2ZrWg)Hf7Y; z4G2f}O4VFRN3w5^;bh@j$T~fmu14Jsb*T6Bg=SZS<*|+GkK|(#{4o|E$&v)f#_OyT zSN9zk?{PF5I@!STkc9FW;jSwi{SouP`7g_oTM|pY=DIpEoY(D6q1o*VjczfxXSU%f zL4xwW7Wy^c;OA_YB2g+9qQy&-rQt(lh>RGN)YBELQNR+X*_)&A6}N3kp`Nq@b;(P7 zbFRRN>qu|Gm%Jn$E+J~u^TbI*T!enhzj04C={qt+KI!Lf_Fu^6R&h#Fp8anjBDH^z zrwH{I@?%yRhWLFQ@%v|gc(oI<3PK@?`?SV%i*YapvXtO6uU>Ep~`l z2=I7gRc0o}l@<`Uyf@_p0i>qZQF_VHgE}LOn|SdC*;L9-UCx^2>z$X zTm2DkDLlx`nky8E&cuO5AI_G7OE)7ySC$5cdaL=*nTf}ocW{4i=q}|RQ{QLwi&h%< zFFD!?%c|cGxA^F$)3L@~rp8G`+F@d?Qt2N)FK0L^2F}-M_qwcRbY}NOI4~a4Uo|XQ z%_?YrYLyDdAuQuzo)fMXg`{3^#5By?z7{ftA>T8iuW4u?Il8dZPA9c5K)L=YY$7pY z2pLhN7{)G@#BqQ-ZI~v{kO#2*?rTO{|Gh5JZ3*$_&Fw}}p-AXGTtPtr^%dxo(0c%2 zef;{TM8*8fOkfZ==mNF?6V{U71+nvSal-M|lJoxl=}f7uzJenhYoteWcHu|xFy*b@ zQ-%p2QVcJQ#!`goN`xg>*q0RJ`VOGT5%R+ipp(mx3%^~(m{Tds4YD(Oj!@a6VGB~T zWH$~cx!JUgD$<) zqq2?$aPE~q3%mie*k_GcvpE! zF;|2=j&oYDiGe99K(4vt?)PpAEqU!gq=^De!3<9gTQSs~5aR^z2k%M1vH~LoaP@uv zqCOx1Tgj`04&0P@L7!S8HtmHK`L7Llp14EQh8%PvA~=R()@E+tsjEdE-H^Q zaKBq<82^YXRaFREzXE4~Mf4FwwE2#X`5VWAb*i+X0LDU-JJR!`+ghY8kQH;&7N9SG zX7unXwMj7F+~tMrin5uvMLRM0Ji&t$ADaL&rC%L#OM60z1buG518lOO$QgO?q10KS zB#e1)+yj58Ib|=-J7IRK84Pnty4}N#{X$LJKml?lbVLwtiwC}7ikkt zm<|(C-Szd)`pWsxU1?sfc1D{_^t-a67iC&X^`8~QIWl()0yV3C(^sc62EBd_c3fDbY-&E)arb<$J*i)3cFwrs zo*u1Mo0yT@SgOZ|Ha0$Y? zw*-Rj?n~FRf_^7@i0E?1T1UG{5Rw!Eu5x*K19;!N4PiJR`L_G5gPG|h>mu`G z_fe|j^(Rr2)OvhEi@Tu?5$CkixTZM1yRBZ{k@4NJIa>P+DBJKjk#34@%8&rh_#eln zOyhW4Yk6J$br`y$w#|lUT&fH?(hD;Xz3nRxBv!#1VN8_=qa&k7;L|10%67xHib0xSn|0m0;R0L;4l! z1d=<$&ZX}6+G=bkM?xzzu7~eU57fU9Qr6Ja>Ap6ELh}n11m8AOD$0gKLJ)gC(pK;& z@gH5V#{JYJSNHmK}yc7&x&G&-aSWN zbH}gOH2Cc9){oR)L^o7VM-^qXM7DG|^Fj7n7JYjw>&EOl-Q#VMFfEo-5uX8GcMH%O zyNgEKe(mt`VCT>`Hx{f!IeP|y2*Ctwq`_3(r9c%I-c6^AHV5hTplU~e?RImoZ*V|B z#E#|{rARd~yd5s*VNC-fBCF`6UDXoVB2%IP<`KtqX=U9QUp}BicIa ztWWXYX&=s3rA#Ki!D*aDYKcKtEN6a4z6VT2jDAQB(?G9!i!8_{lz#jXDnPr#sxIat zy5g#G6x&AKPwf>*Nl!J_4711A<qAmNf$cpcLXyy|1efE<<6EmC!N|=;apY{q9`EjY`F9<_Ws1V7O+NKCp#X z>Dgz{Y^U+({_>ju${o_KO9BS=9Uq-``4^Hccs+iSuVc?kzeu@6L;Zvq^{I;+xWfl> zmKrC#YZCuFe+Yi0eVdpB%KO!Z8DV`;Z4N~)v(}9kPhxLNJWK1b{sG|04xrz4O4`03 zr4xt`)34(=?aFL?Aqa_f&8e5`HIo5c76Hz#jSmZ{lmA@h_JYJbv9Uey>>3(bd2Ia?XKOghFJX zJE5q^A(yiZC+)7Y)gE;f%bS4$d~i|f;!p|rVv6)Gc$nt$Xv;B0NKFg>@tLva*8sHe zipwFFfY3*@n34E*GP|Sd+}vhgrv8y9V^rUJHO-m|%ub&@vr9K}$FaV*E8pbkMAj@~ zL&X7BPM?;vgH2zH{i#pJ0allpdx3cYH}k%}zjCQt2cw1=3b>j}Vb{JO{ZRAeI>jDB|5ori}&eg%%RIhg_^MLQVD8H!D zQg>Ah0C))n|KWRB{Pc;5QMb;x9-#UWS{G2x0PH>D##a*_gcMCK?JTsIHUq3y);*CY z2)P5XqX}6>CM*h+wTu6yh~J?9@aliD@IbJHf-yDKwW91hA)??V%fFLkhV(E5g@GnR zz8$pV*yFXEA%b@_M2pajcJ89&bNc!UrT`1yhrznJ!>tI;ji^eUAz??>H`Y!@BjM$U z`N6X0MO2}XYxFH*!51GioKP_S%OlHYb=fsH7ItZ8LmdQz3j4!or|+V~@*Ituy-@Jp z=^;b^SW1I0+Gm|wSHigpegFEAgX)%Qm@A6Ms3_R$GJ~aC?Ff(BKF@ZuQ7$jIKveH4 z8GI^6-pjF?(WUnTW+V95WLP+4c3d$~)5WOh1Spmkg1U$DfRZES#9mXzy^MrP_9j=@ zPy;&^V`cW{J!CuelU>vMJRf}Q!d$Wkiwv$3XTD@1H%TU*rIyLHrRcRa{oY)HNkG`A zVY5HdK1P>4nRTCwf~WE>Uu~QLgHS zbDZGo1BZ-!?2q31Xs*ym24g}QG3ZWDtGu)NfWOwMe)CxGkYbh#fjgbd-+H`%3Fa$Q zm0;)b^FmgArQEF<1b=JbI5(@mmubw83iP!6Q{WDIdV>sE`mYGY>O z_pW{XSr>$N?A?G~4Iq)=t<(#?tp?j<$8)G>L{8NX=LVubN#WQEdh*U!>M`l?v5E@| zE@$@+H5?&=5YbflndU)d%Uu-)b}jjf9Ih?Z797e+!O^WTwgyEz^(dpYs+%i(il4s* zBMowQS!2bRalag0`0yYnf!BHZ$}T!5FNB7Z+nj8_6mpTKBWK!i_OW{iM4;bkcF=sM zILJi3t{+_En3uS(Ixe^F-k;|lq7tw*aDD0xv1QtkZs{FTK05aN;>#ODPZ6VQ-}Kdn zeD&G{M7G?Jz2aok`I>OICG+i*uXrCne+sG3evq28HBgqUu0166ppg44HFyC7}bqP(td;_T8}7qvOESHr2_1Z=pw$%&F3==G#0<*;KA6erW`=- zgHXp|NA&{0IF{V#6xkq{@>hpZchi*RJ4avI(q9Y2j*5S(vmsV^YHDT#bc8|aB2lD5 zhu5ZD0%-%ebWsjAZwe^%-F@sTBr!H|OgcFSA8N6uy2w3wNWb)dXN}HwZSnpRDBc!B z8hAx<_Kt6lZ!t`D3HwFDSmGPUL1e8r zRp0y7FK4=V;gr-FkS&~JY2+?8cIX^7%<84_{8*3RR@ev_`w3Xr}KCnvqTML%l< zS1^^H^25i({hWofPlww=d?LcX<)g_Iyf&j_trbQi`Q13V0AIg33sMXYhPf{UJtw0Y z69NaKLUG7OXi17a)Zy5Nv|g}=0<3d#u^H6!zQypLmn6cYE? z?hggdl?B-M(S`$^Er!^I7)@tzMysiPsP4yIZ1q}?eiSy!E|)SU{mvja97mXwO$J^9 z-_ArkFlBk~h(Dfhwn9g{_$|XO@s*tR(NjH0^U+DxS$230uXz)iCt4RYHt&wN*r^Av zXx-kVgUWhKnVOL+n~${VX-fkqc34PvocgV)GrrGKNRy=kH&<4h9>%l5zn?#5SjMj^ z#t8k6$niI~S(EM9C*q>1>G;}=e>iuQ*Sjvexx!pI>r*Fpb`KE?oZp7K!D@A;W&ryn zZ8bB7kMp=!vca?fTd?A^*K9^_yb+4C#%<$FIlFX)7O7m$%!l~KWq<3|sk$m;DpqZ$% zsU7V`AX&uAfcT>Z1vEJw&*3Uc#}UFm)^t1&;?Nb8UUfH3al6#$8+|X0@VsFw@Obim z03-6GYZ5>#&$kw{SMoKnMI)!ijz-*$&61}IVeceJP&U{u{E-n>TK#tN+=loODgg(Y zBhx3ASXzya7sK)Y#kKO@DzQA0L{;Ifp5W;+5Jvu?BB1p=!Qr+Mli>lMCqZhHDp32c zPG33P(dj8X*KE4m+t@#1{~*J^o27qNQQbqn9@gtg8>S%+idtcfWm2XbNFa@xz&J7N z;Sr<^Fiie>9rxf+f$;^3&}k7v@HxA7wUDG^m}hx*^88=5A?NV#0+MMet)g^n z;lE2dhu(?GQXj>{m@5CaAZ5SKyhli#ZKbjH{LB;(h7WN%C7c*Xj5(c|nva%rV&x4%} zV0JdF5|<@2@G|E!IWaozi0DFFaXjpMQsd!GByZ3x$p=c=txR>aG+ZwNnT}q^t#gW0 zJo%e!Z+JN%r&7yXsgHL@lu9o@R=3&ew%Q23FI44^dv7dQ9$TnjEv~C)j&@9hC1mu3 z?KZ`N$*8tzD z_IL5prdiKS{^eKr3$y&8NGonT_ye4if8{s-Sup(%XVQ+c`tzQ)IVa2f+4}FV{JlsK zD@_>}syGxRgFcYSy#h?iR8Ep71|-G_3lM04@|*NTdJSRUBJU}aGwSqf=AyW^0kpTh zV{yZo7GY{wD+~lkX%7d(hnF1lN*R449X<@ehcPXF)Iqvd?oAilR+_fyl3=OsB|qjW zl^r5;J+GD!2or>|lhRv(jOK@~t&qnq1~B96&Sh%Um~b=Al1Q}U8@?20+Re{0iY`%m z=hO4bFPTP!r*Q$Qwgh|V4_7Oq^(+<}xEHNjRAErUzGtB9UNW9bTV}d3izJVYjqM#B ziM0+G2@|?C|X5elPZ^fZWGghrm_G85S*e zP{ z;6+4*Bps>|2MyZoVOIurY!sn_K5zm_9M41x`oAg+8>QNOpr}>&v;^jv zawro=O4n4oZ5#SK0QGxiAV;Jjb%5Nm`sPBHD>5PvO)&nB6oxq2!1_ER%GO2}ShJ-m zxw}q4Y`Q&n4;ca8CJstEg(W;fSB{9DU;XupcCLu1$klaggASqE(}i7~p`w2Xk~TRn z>$qAkqu4?L=jQV+>|4qrn`T?ZTVJBnDN!Fwk8|L=C4`M%(4T^dBH*-7th2tC^%Rre zEMrYxGBq1*-?xn`6RgdKw@(oKoU|j*X{Zdckl`2MCn0Y^nCy4}^4z$Pux$MP1nDg6r^YA6xi=ue!QHBLp|!9aX7Ny!ODTWjafXdER)g=x!9bC+ z;?*|_v7|xOjK5A@Nw7u?i%k$)iR}A?bnqf%JfiYK?M9{q63gBjUzFlkeG{cAwurn| z5#8hdD1HQ-ytJW`_GTpiH9U1}M$CvI@uZBrk=#ThOAttPAYn?p+)_!L%)ZwOY%MWU9Ztg#MARmJg$CRcZ=~E(sU{O z!qOTu=j=020P1`<|Kdm#`1bZEJVx;p-#8y?Fgn~7Ed~Z6AdQ3>7R};I92|9SNny(( z(Cc)Gj*X74F?2ApkF5Jc`g*L?n@{W^8A`f$(PCO@DI&ObX38nTZ{KcsReKJ{ck+GUh0gX0-L0B-D`HtnAE#1J9rlT zPR4>A-^LJ5xB1DZu102coE~gqzbwa)iNURRd8gm=phJ?)t=S6=gK`}qBh)Ot4~0mE zz$)~+bLy_+&sIHz=g(|a)sFZJ3$9ho>HSA_Q8XQt{di{xjR0urU~g_>hZDZ`mUY|v z!dgJT6VbXudbbYpI=4jqjxy-9XPOc8eutL^JGCfd=xz(h{Ef!XLYDZ9`?DyWXoP(h zT`-X0#yxiCh;AZNIP%bB@3PxcY4{}6F`2~GhXN`6<^qZozR*t3*v>6hs@`jnHDsa= zS3Ae(IcQSQ6!`)cTylRfM|i)+*+W7c;cWCcJwI;Z==gU1*%#aI9MT3!=H;s0-dvdm zV&36CuHG!)-Z#2d)f_8(XZL@t4zu@}7??KkxV$^X$h5u8~5m1H^@Z<6fK~j|og2vS8*}nGP{T0yt>#!uu7Q`*~QZuD3*lv?R z9f5*(l?HzKuIJDamD~Hymrj8?0iPQ$`>p;cm&XXdXOu_VyKB*U6BeY-#fUAp=hf`Z ztHuhVrE9mBc|U0@M!(4y7KNb{c#q?PPi;kOvhvx+TRPCQhI5_A4=>NpP2C8|gem+h zgI>4ardwp2!N|moM|$^;rXRXUBZxk)HjetYoapQd?M_6e{BssSpW6t*fCX>Zixea?VsP{NAnr zarvTiO2;qBW~aMvi0E@K{>e7~JL>*>W}5$k@f&fZpIBKt=L;O;e$4XkA0W&K4+$Yt z#zjsA!rr^n_!xNsCp3ZNQRER`eb?(^P1Ffr$nc{mDZ)DdjNwAlE;Kbmipc|RfPFOa z>Ash!?dU7dfZQQu!^PZLRMaLyUQc_x!%V{1Lppn}} z0?@{W!~QCmVn=TAbz`mErQGX32mu2}kMqfQy*J2htyvn^qC3=tVmDGHi|$+}b$xNM z|23=0%);Uy6a>!|4I4Kcrpkd=kP_+gMK+d8qg-8)-VPV3ye#3EB3ZZ19Uzx{qp40_ zTO(^cd~ooKCShb}l!McL?ei5A14HV)m?|BsZJ78uqYoyaqK@HW|8?>pj~3b=(SDty+TN;Uq#@vz@HD%QKIMt6$*N5B0zY{9wI z`BH7b7NPdXRfk~R9r$1iP5YY5%mj|+No(YCZPxEsWrr!M?Q(50_&{JHMl(5bMIEss zL@L+3!P}<3_N%+}X0p~~Pl@p`pL$(JjYStf*Qqw@YK(C=dAhhE+|p(qV9PnRY-@O! zgpb%rwJMMsz8JAiI_{7f zGAuqL`1=4@goxnf8;`AKW=EJ_2O0SDFgDFY63bBti~lZC?4dNUikRN$L-_HQ?d{nYihG@ufae zM{4ubme*HLViegv|4{y7aXi4W?HOZffccI+Gj<}1H2g?@;vlP>nOCXgKuGSk=!m4w z;R99F_m$3_w%AH!AN`OwSd#ykNUoOYXRMNB_2@>EsdeaetH-3@s5z=r8^ zp{vprWVzjl0zj=&w>pJ3#yO5A+PmqW5k z5HbCT0-^D(Z_ZrJ(_MwQc~&Ht4B&+XP|OKRvUmrZEFzZ5cjx8L9|UexJ%8-GtZ$I) zVmw6x1CG>fSDN^RGU6YCn)#$#N!lLY?HovjAD}olje9}rOF7T_vRl6&iNW|?N^;V8 zAoxDZkd_b+WIyeg0UJdIcg|Dj^D&GfiBRKGyV`AYxcF;cU+yH!z{7{LhOAn)DmgBY-gDGetz#5c~Glv z2w*%FA2K4g;BH8fQNSNcP0Kj1J!#R{1XpzUzpZ6 zYwJcWU!nbNoC;lE{E;Hi>%1IA)WxE@;2I8OydI{G&^ z!KP6()r1_ABX>X|ubQfm5NF6F`Pphq z#Cy|h>v|rFF0EQwv5r-{i9~F3VZAPvSYK{FB4It@PFoq)U*D8p$L1L!hKi|I2!_4K zl%%98iX7FcSTtqrv#$9nAmg22t!i4UEI%Bx6;wyXs_P-8M+%D_SB_|2Kt#i2yi#A! z-d|4H-`_u4Z@>tO;?vlQ>LqT@GSjgV-7WBqyOPd`wbnnt7`k=qxFGy+NS-x1KAyI4 zeo$JOb}eqWZ0A!4C9xoI+_nc!9LqgP&gUj4P)2Q(J2%F z>_|VE=ktI3R#E>mEA1zax3yiW%)?_=t5cquwuL!*r*%au9=xwuUxr+}2 znLvhEJ_{&Dv_|}Oo_vxb8B82g-lgv%j9WC5yS0%uLpZe%#GBW6ZBd;Gz=0mgvrCBV z-rMEW;_g15<6*^=mA2ykrMOoP0D% za#qe@w3B6Jua^a}NrEFeb-(q62Z~GhiIWVAETdeG!T#3V)%$RF-W0;%sZK2z!aCqC zYeXiDh&?h8+Z7P4c;Xh3J^z3R=|;qIw~sk%hD}@__H#PsSh!Ko3vqQuC@6pThymYq zVfBp~P=RHwxmb`7nokyQHsZ1;dHDtdKOCgfNON={`bGQ$PWpys;JI$=WRI%9vOv0% zp(#yg6tkpfh=2h4rV-2)1B!h|{~-^;HY68_d=E6TGv=yB0d*Uo>VEqrnka*{%`Fgd zuKm%&rZ;R$*6w4&tXS)x{-q=i?zhd&Z)?CV`Tbji;44v)3KM;p*V8z76)N8u04+o;YhbG1w$S+2uHKh0cw`J`?f(-z)G z*ml=%R#tBRi6DU`IY8`lY$W6YOdTmlB8h7fnQP)0nx4{k4AWIK_`Z2mjElQyXCJ=n z&@wxK2;nup;wr2dV8fnf8ndn^Y%mu>04W~6Ec<6B6qs#BpZQqGqt|^gpW0Rs0{G0)(dAf#odbK-8v?Y!I z(%1L3G4Gi_Sggpg)aXQNw7t9+&!yAgjIo{&2(mtuX>#I^KCkElrwQean8+&~5p+(t zJ`q){>x$AIZD_pid~m;z#(lY~tTgr&2s60bDRMZJc<*-y5~pVfss6?o12U-C*f~wE zYPuxfJwj?bzsK9TAe5b;tahiJXd>t)>^Mj)L#JujIR+)jl<=IIjIn~9h$i?Pvu?)F zUNd?eb9NHdwVA^8cU~^4)Fa1r+>DmjI6ZkOnS?9?C)9pMFAQc$cW z>Hip}EMiIU6lP2z7DV+!t%_hjUwjoH52%Hj&q*iP8OCT6u z4*14fA^a=bx*>6Re0lK7?rzci7ySLd;fcQjr~fh#a*+QQ@pTu3GbTZxp^Tjk5w3Af z8IpKe)$m2?e0h1AdMLSuUA*49C3wCUd=!+G01?moeV%FTxMJPDN~-iGGI;E^qFl1) zuiD(YZufZz={$pZhJrq(?)jazAgEs>Rvy(^FVyMD=3i9t?09+7-Z4{2HMUsvATStW zYQ;vnRK?agkw5Hi96XG54va-to-_?dYq?rZ<)C}b5;Y#(etf@jQ?)!W=UTidO1!4h zDO+<;{eD%?J^mtqn~<`LY=L%fUaFyWdH4w;;(CS=9za1Jc2>z*0rtFbm%5EGVSDI9 ziC-*E_!lYs{|{|%^D(#*)BAKY-DG0oRiJI3DDfy9T%4DP8ganGUmbkA4z3 zerBra=WU#?mcu>i?QH^z|4{DJ)1DJ6rkfrb8j>27RoI*^7?J3pHl_ryM#o^^dRUsq zkLdTd3fq^W8HvI< zOOC4QYGIZWkKK>TqYY~LDaQ=bzV=m5GfhrAwD7;@nK=a`l9JSH>}+t6&c2`Pl;r8s zlBJIrd;Blf-a06*eccva5fUJ{yIbQH+`VxN?i$=JSc21NL*wot!QI`hk>Ku5<1UwV zU+uc}&f2Hmu5;htU9-F9udC)ahkRprg&%S$2unuuO8r>gpBk3(@!CGehRlZ!76a3H zDeq$RuP;F8r*~Mlj4Vv+oJswgY*Qb3e^Sum)KM%c6ku2wUd6or9WX@^s&I_vEx`;$ zFda5Xb5}*`mrRu+aYW#)_Hc2__(M#@-Ha}CH*HBKhNTfII>;_S5R+S(KcnW%FkDe+%(t%3uz{VsMC zDAyB{>7U|xnyRWyX5>h>sxQSQnki}%k_NnCOO2)*r80vBk$+fx!9uTO`!Paus1$_3 z*;$*pN^d{y5|A9w9KIxGwkq+K@qzYAj#s;IN{Q?ZFM0Bujpes6#l&?L*;%Fqy8h0ld)gO zaxW*GI|YQ;R*kc{_X8%5o_CnMZP;aUpl95y!m!wH&hKu&V@{??J_LVg;ft!*2-ytw z%Dh1d@gqe4{bsQsom)fNGm~Ng4fY$W`21XoNls-2V|;0kvStv@M==n)=qC;Y_zlI~ z-lh2mvSn?AjLr93AG~*nPu5s)^+kY|0<+m_z=oWPiJY%pt(LS~vzSU&=%WeIW;`3# zs;!B4?T;pI3C7JXKDbNhCD;H&nI*HC(O#T8_>7In+~u;>b(q2|{Aylast$kC+h~w< z;Un~2;fG0@So>l=T`84F^$?@+sjp-sb(!B)~@&-bizV{65MS11}^BX1HXW zmblQqZ^)xpG<7qk75%xFN6zgQd@|7rlnEI{#TBx5w!|8`{GdIfLNUCR&JA5>8N;T1FTnKpv*8?IG@I#}cM8?X02K^_yS|>Q z(&+(5XPV#xmaO~S*OU+9!^?%PPM_wxXe{W0(lhB|9il5aWqJ2jo{awdP|j}pOq{5= zI<@{3@I%j|998sAgr7eSCacit>RKc{taMLuI$z%F0}=lC&|iBL0p^s=3Q)Ken&cYt zt{9a$;Q3`-6C?T*xm&oS0!MqCm*|a!Fi;8E6yz&JF)zTU4Y0%=GybufGseh5nFKt~ z%nCS^8fh3v7usnPVqJxfTy0-X><;f-O`O!wQEfLAwuDbF+Z{oM9r2+8LflfE&2>V} z>w=kxKX{Tn=<@-l&c0IqDRNq%J})w__F|1@B2woSS@N+o1sY+A(wboRf*&N3 zWjPoyL2k;H*|W^_^H^T-PVdA`dF9tsL$o-|fS93ueh$wk9Yp_oT)UF;^Jbx>S$yg4 z7KZlIN2JA?v!UU4R9!fkPfLIn->H67!%e{g!H$cpC{yoxY3;keA|hI{P8+3KPhwYZ z0Eq=yvqgH#xvU0M=Z7A2C8PIJO|~kz_G41vUj(!n`)Jc%&iX<)+cyn(IEG<&pO@Bd z{K`q!=lDWo?PQ8e18pPiE<2xgwX%ord4)(EAB`H_7)MGsZQ7OBGnznp>nIE;5~rhx z{nr8xxMPLjG+T;v+j!%I%~PzdeKZWKXl%NhD<x@lDk<`bWqU8uY3aa zz_FVTAyJ1qN1;%E&94{Jxu;3P{XEQLeDG&0#JOv8OOx^<$R{7FX8Hb^5JzJEHqZab zAM)_?6{7y9MCckNMTLe%Re<9E);w>3MkAn{b&izCm%+;=7pU<*>;;9J`!*03V;r~D zUkw&`KDc>-#pGON555+mJ;cs_627AH+fK?_kNH!dT+_)ILpkNq=6yFFXLx@HT{nDO zsFtVSWjPQwSF5g!Nb`}T1Y(`5Jx;X6D7TNb1g^F4`gt@m4@B}+=nRoQ?LRvWqu8>i z3L00coISLYYEJkjE>FEY%-&~zrjguiph2;%N$PVl8f>k8Fegz?$}fNmxB6Hw+|ubM zsJeCf>nRE)VcziG&m!7pufhD|B9Hyk>lfO)cxD0$LvaR*92}N=Y^F0_c^=X}O17Ys zaq7|rAM?+5)=)3>ma+le2)BYk(>8Gb9U>?L9 z=Yi+SCNVMg{q5ps$|c{Olp;1^;n3eDn+ZvVlFV7Aa<8n;re>swMi1ByM17(6{6Vsg z!VGh;B+TBU&I2&jDo(zIv@OO2vTKq$n6Y=8gC>GaL98wbb{VNG`1pk~U-KY4dfvNy z)D0I>8UV3X6zaOn-L$9hK9jiuMzx-Jibi?0uk)C^M7xrScVp8Yrx`FG(&}ms$OR4? z8*j9AL5Mt;_!~$3-<rMjlDy9b`n-0(ttB*Som!mC&j`{iPPf@Nmt3<7LYjQ@_#_ zfNO9ofZr@-w0}n;*}>s?RXaQC#~&TVQ$PKxi~NX3kJTbSlPfbt?+V}Y?zki5wom4v zU<2kiI1|hAHePStqX?<-^&k2f8+S4$;f=4xZ-O`#hX${K2D22-SSh6~x>&JMQBfQu zpQH2?O+w_WqAo=ZD1Kt!mDJG2Iijn8esZUcrY7~U11R0(RwY3U8#(|MbF&OaTyj`X zPY`%>Xm^6@Db8IgKp*{f=z3By`3dYcSq}cIVIn&y>d-Wj1!LFDU;&LrbjhOc&|r1D zx@2~rHvaokcQ{%z7BdT<;DN&7F9@>o7O>+VdB4NB{f*1y7;S?bH_$D6`Y^i=*)<8!7{N-JdDAm# z0r%Av4Zla(&?>KLB9ORfZmftdc4nS@J8)0Ud9i+dQe^LR2~~w}I11o(l%sK+y_|pK zM;ALP$DT3brpKQNOa(JiBiBYpW zz?~&>&Ibd$g;z&t7ex3apV9034Za(`CZDh8F~*TPVFWIqX{?{Mxnsm?$WK#~pH7qR z#C~3@m1bj!mAU~dAOee9qS7ccQ8?NG#6bP0Ou3=;Aa5!=8$9a*xw^N1qp^iV{e3tx zd{*1?(?l$4Xh7#i8nHw;zhWjh>|^_MUQ;a8AX{F!FF?O9o@6t%|4b{UsT0lgHJHh) z?>X*fF9kQW9Af$*CG^wMO+5I_xfDHl)*U&1F8kB(d2=6UPrt@JB+oI34c+-20bxBx zvYC&bj!w_z2v$`i5(QSUi^x!0RDLD<0wnwfF&=C$lq}4ClCXk8jWXndC_gxn%r|GP zet%LlaX*oo2lJ34(dW2tG3*wUL}fMt3{e%xi9WYpy48GCRXq7zrTL1DUz|^z5{jjU zNX8aPYs+C-dT)1@)-IpV&XbNCI~g9^UT@M`l6 z-mz~r08eh5{lba7X*E0SElIY8Oy8Dn>i7NhgkU(U{g{`35up09rc+Ruag*<~BIj)i z>6m>@CE2_t3!;K$MN6je!MrME;C*>B6J=(^x0J}67PqQR_^_5$-@?@RyuH6iCC7Z7 zku=fkvlP8VR#D|Q^GzfzNXop4ypFvA$o3JwYp_E76v4(gDy?ke6z_;wFoU*O%Q|ES zS_ox6D6tMbU->{?{SMKEL;DVe@rERg>9p57C7r=J%g!TYZq8bjV0FXyyYGpbJ3r(i zf)-H;=Q@DJzWdJjXZJN-otq~r!M%_6npH3#3>a<(apH>{Ew%G2-w|x;77emBbs}sY zsFcLK2-a*+O8a^_RU$O%yQLMtZn#)9pn1KrZHTyS42--qq7IQ!wJiKP32Y0+VMmFx&eb!J)ygh2D6Pnx3G7Q9>I=6L31^|-fS`1<~k;( z&d2XBob}8n<+_c={}FjCko#Ue{UMA5?>O;4#dNnk@Fic|g`+KM|L&|6GJj9y#b7C^ zY$6sTPfm0Ec+c`e?{|ax>>HbYihcrfwMTj`rFb6pf0~M^n10~CT86d0@nT|uZp^+0 zKql+0n5bH~_y^7!v{nhfFubf4owE2p@ji<@PtlGpuL8$hn~<008!T{u820SiMqLh| zM(f8)q4=p}roJPbJMeRB{G*nzjDMrY^4Gx!2Flu11tj=|re@neeS1$&wV!`ce?42i zKD6JDA0wWHz4FOcgs_68=1XJ$tLG7KE2_DjcR$7G5!udyQ<4f5fkk)2S2hjm3~+Wt z7dH&?pB{Ftew?xLAgN1S6B{5JWq6g7|YSx>3x;~=w}h1x@` zar^bIOq{>(13O3Jb42-x<856wP!o+&VwC2!$WvAEZ z9K2COWZ-!Qcg-#DwZlZ&goU3b<3f1#L0ikB9V46v2N&0A=Lo-tZs2i0>lq;H1sKg? zbZ~danVrW4%Rir&`(XRu9Jg~X4(w8xH*y1BW2g(h9qbpq>I{BwR&QDSO{qFmEu-vw zt}8DZ#GFoS%G-@S!#Hno{m*cf8J|B+^_gE^3?dpAA=jnOjDxjJnpb&-d2@trmtA7Xr!rr)o-z+LVu)^{})% za*Yux;mn|_S3Gs}?nau*(Ago@oPF@ye5gtqMGqERfy{vUs^p3dRr``UaAy1lkS({Y(yu)@nem0&*PIW^|so%JQR&c2Lp7TmjEafh|kc+SO#`c+4q+H@K6P?AWY$>IZG%lVe;r<=rU}e45NXfN>5py

jFCcH4&c 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� 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 {jPDT^=jo8JLAn45}Ny#i+1wxQHn3Q z(BOAz+paE!MBb}QyTji8RqT&<)(n0-?K)IQ;EsysshjYviEg9X{8fnUr!7F) z6HrWCzoWUw+Xw*?TFyYLWf!(aA*thBM<|yr)KP#lY;kT~{Tj4x4iz9`yB#;Ezpv{l zr`>y`(fg9WL$^?*={~R@>ZxV5v*vgnGh;R6+0L&>U`XT*XYqwr?tyvFiwg`VKB3p! z9V{ItY0_uz4kU8V1Uy0=+)m%uTr0SP4a$weIb9%pdcy==86Tc-ac{hp&#p4@WgaM7 zFnGYu0-Wua{AGs%)+@7Iv6Ob)VlC3~|D8cJ0tF`-nH}LpBLd5eZ5P*Fx&=2$U1LED zKkG>C$}#h&>m|6$f&+6}GRBlD1epQ{M25y4FGaqbb7LRt%4?{CVPi z9WXG?LO_n4JK-)8!D~(E=bzA3i*O)sN#TMTkRZXQpzXC5#Hoc9Sh^pKIQJ_WtJ^#M z(s~1KeL#sZlYVCg?OI&?jCB3}@O{0SRG1P*^mAf9XRX*trFNn-BD5YGx-hjxRu-UV zqsA|aroGNdoQhRbw(vj0IKa)qS{1Q~8$FB~2K0k?6exr_SRxGL_)Z)qcK^+T0GK-` z!K*TIHMqDJrBxc;(q7-2b+rn13YG=^7h#F!6KqbknrJf5hqY*L41_9}%_ekOTOmJW z&roDCS*zLYI*MzdD(VbKq0q>BPbiM}UidK_0L?Q4+i#=Gyp zo$nuK2K8}aD@06Q<|}hv2#uhl#2kA0FOw%NVGvmtjx*wyIRaRICONBgV+1Jv<@53rsN=DUi4U$S>k;DpsW%4z z+#ly4gKEs_yup5Td^p+qYZ2_p!)x}$y2xLtP2LWOgB|9D|UEKSEPHb5RT z8~jgMH0kZW%kPDkZA5;B5*KU*6celtpLE7lceKn6!WNJ!F9G_0{lAszPsbZixn6l{ z0iKzs(y=ASaDTUZ-h5VQbR;u9#XdxJz07v($u3AabAq^t7!6s?UDtw?%IN?XQ4H;O za-3JURVsEKn=ga0oDWjpEyrQWpQq8Ae?~z&lOS(#VrKOTR&L&o>BRmu-$TDqNj-5)G^ISp4C@_CfS^DL0! z{_PoI=KFAp<3g{<@Z_|k<=@(|U;T*s%t9HANH2PZC|R>Sbh#Hrt=rc-! zdKrw0BJ*4X>I7v?|H|RTYx~m-x{=(!8>`#bbxgyGlXO{%p8O&py86twjeG@%NtEC1 zA1Ku-NoD6I+)JhBAY%M6xE@=JC|8Jdm&3$OM~2L&2a+-|DcJ(w?7u&%=NCt;EiPI^ zj8BS`=$GALaEXrBpo>fCbUKO)kyo-e5xn4H{9lwJ*fdRezsnf{jL6V%;~zW~lWV>f z`cvLX&9N3`AP8IsB?bwyZUL(3ZwMe+J4Va?>{8XBVSqdKxV#Gx0n`&+Tf=o*W|m?s zJvGbFH-x1Nn{7}H4;!Cgq_O|5DU)Mh5ro?>c7}4QS`FWRd-d$(N0y%nU#Mo|47w+rMs=5ez zj#)1&Qg2M6f)Yxh9*+-;z$0vFt)x+_C#^Abpbxo-`MU&})jKXpEtUapljNX1*@Nv~ z@~^w#yy$-jEi@ofRn)JaJsZlZMaw7t)7oT)s>6mvlEzOtJRxDg;vw3irxmXKj*QVT zLkWoIFhClY3Eas!f%6!;qd|Y9Qy7D>DOM;k)YENd3>td=I9d2!hY_+z_9bF9VS{!w+jUT# zBfnLYmO|ion{cslB7sfY{<+bi&cns}ugL{)Cv0Rb=jq?d0;|?>6QpM5mtmq((m`WZ zl4fC~Elw?3Q>&|RKQm8);LUItO2s!laz7(@$fo|#)()d+46=QHg<;;wj52<#%ows1 zB4XabLkD#wF3PLTSNM5)HX_Qj4tj=M6qBRlGPINW1JzgW5AiJ;N91$;sa$Ue7LoG?;CqoFFlCK1!S zCl@qCixS1~V{D+wI!L*W?c)5V!nVyp4@)tA7a3e*T|gs_tp$z#^B2=fD6D0(l~9j@ z5AL7_p@WkKA$biQCIg2kH=0=`=vSC#DZ;iOXdUz@i#xSc-0S+fRFfY1M>2FMg980W zJaLjZ!yM-E?0c*g2EK!cS`&NRPJMhPGY%S>D(0hjzyVj*C-M&F_a8CBe(G>2`6w@f ziJU10y!j?0dq1R$=jV9i+< zTCm~vIA>h06zbyiJn@@m$Czp*?7bvn7^of#Oxw|yc5BlRD`gJ+_j>v-+x{O+E=|}s z%z-ti9I5rT+Fiu#^QpB(V&3?de}A_{%$Evmy|-Z}RQ*+1dTxW#4o9*cp1`46nBDgD z(yD_&VN%LXI*aRNbSdOOu2tt4G=>53_NbV)Vqaf~PW(7&(}QE(g2`WJ74m2*d&Zr( zLasElNyrT$;Cb@x(22|qN_qphrNoKwQH?`AniJ6TCb1#pwRe_vxs`0u6-v@M5_hA0 zW2G)^rKYW%Qq2f_co&%DizY!46`+#){o7!`lmEgwiOwr1_d}2X>NSySJPs&fl~hiJC?X- zK4yM=hHgj-BRCX?s2w(}wx6i_ixuN?*Qp*c6Stg9RrnFTK*?=)&JLIG%C|S&-M}7r z#lN172eohHJ!>;~Bfb&x!mgbpW5pZey~#*PHbL31+xda=Iv&E$t3x#(EJS_5O`1eB zVe%iO{TbesWigktW?RH>_p}Do3qxRIv`a)VSz&&(bc1T5@f~A1hLK+4$rDQH1ur$s zw1|V6J$!FK3#I-VNYP4$^c&d>d5E@Tkc|Og*6qu?w-yBPMUh#FhBtf_9o`_<))yOz zrl>!ryMas#?&^sJrc;sBE_NZ2>OKHh3kSX1QE3Y0N4648b%=!B-O|rbTI{6T=oL}T z@@y@e=$bplw-#*x5OTymYMm`&m-){UBj zHeju7PgY%qvmoiXNmo&H1E|4z`?k6F0jHah)PgEkcZd zI_(QrI3*&~VX!8dkc4leC( zSnuG-CUUBBQsvf%EdK|T?10Xf74hw3a5{^{h@+tvgOQ_N?DMUimzGd>FdX$*sqQ@_>BbVSr;9QSL*z(d(Gme-vy?w=ieQ;ix7F;UX@y%jJoevV7eOx2Um{^8$~ zIrgu+Iu-}s)Yc!*K^*~uUX;3CX_R&`Ey6r)gn*~g;mT*$X=Hj|z{B_2Vk z)KQWV`)xZU@2zl=>@>nBDn~kVZ-J-}VJF@Dj*v~@ir{zile^meWwEb>-+a7d&G)i* z&j!pM$>-41;OvJzsX5*W^TuvHCf^y0M!|<{=+d+^K3fpGoi!k*^PYseNMrqbla=at zGKL5!arOEZQP2vfPL-B+>`$a127pBfVBxs;{v4d18D|lRgoaGb#Vc8Nz0J*15|EkZ z1fb`v`N{w)k``X1?nOQr2y+aP%L!&Ez3`qRpxV0@X}S0OKGf0d zE%rW0mszqqu}H00&njf}vrlsRp!U+s_%%NR4BS_Iqu>=jEuVwsb5y~T3U``9778C8 zCVw`WTJ`Db+pDFWa(G`;u?@YusrZ-jD64 z^?^n4W9Y$X17?iCRSatJ|1o6$_lX)i39qmxH}Xh4gZ}k1$hM4tn!g}*5@Zx+ze-5J zfiG0cS$ojmoDUzr%AF-g5ypUZRS2>^5dx|M=a2#Z64X%UZZO4j&r?>Fu-t_9vkuTDq{#7XHDTXM=n$$9y=AU4VB+z z9pKjuX(`NB87AQj{SJY(eIuJN9azwoBI<>ODGg}xI!r)5F%vP+;^+t{YBB$02_x}( z66kPnxhyacih^#&bZlW4T@-=CD75acA+)BcsOZO!9myqO9^ zJ7YY!pe1Q4qM!%*EdZCNOx!>RGch?4{+E1uM0ihiXy1(QnT?G_NI3jBK_Dpi773QM zouA3k*;)8A#*I=N1NucgU)lJlfX6J#xEB=ER_4Dy-aXmvV^~kVLe)X~rA3?AuizH0 zQ25IoXFWzS43t;^ag}3U=DvT!Z^wlTi^e8Djg`dSJ@3^ZP1gW^M%HiMfsZyskK7&9 zkqFGg$x1qx5TU%LG;Ksm{0I`d{x`X4YVo#D&QX;MbXAFHXO?jzj ztbrKRWI#LMBqc$C_;U?KKWI+cjhHZIm_6>Uc1#xlbR^#Kr{>Jwn0^ONI6QMjKqCf2 zgjwKaPC&hgI{pZ*+3}qfgXb}lPwW?PeGc0cD<~gu{{<_V!&Yx9c`GWDYzdE9&!m!X z9D1lB?gfQ296dBBVEA1OIp!_tGyx?Fde5PJit!FvGUmFE{Y?@$z4>996P_HiGGzc` z9%&XYABYf!&z_(B$n?Kxv162gxfqRf=|iJD2Gzu`cGlQ>f4}^b)+xaFv7TAgo}snO zyrf+A<`agINP2f(Kgw@UPkJGYAVy%g*Sw6;y6$vs1U@Yfk^1XX_O%qRXt3;Hqq}(h zqfa&r{jx=_Srve)>xN82My@hiqFljnIhOZ!c|F}Lcz`bbPCgYv;W&37{2|3*IWKUn}FTO|+o-8e35lmwU5ik%HU zEJ8u2JqTDw(1jQ0o{$|c!;@4~5}B{$6d}bona1a&)i0;C>U}M@HJfFFc2F}&l9dDW z$0=}(nL#JXRq^w+e4(oB`=-*EYi;gXGoZ)X=ISYX_Yn!Fq#w5xQGts4W$=q{+# z3eR9CNX;J^Hi%+}RY0LsK>5VV_30#UlnY&t+-f&{$C760rvVYNM9&_DaAZ?G1zIUR zd&U}g)6qE376`wf<@4j(hx=)7Kt7pmP*DQlSy`*M$d-<7xljWUqZKw^C|PYc$z>f< z{`IhvSx}Q}IzJWgY6Q);4U|-L!=rCCAm_xM6I?0{@ybJl^!v*03{^f}0Lk2E}vJ0H1npKFE`^B><8Bhk-Gitr?PkxR+83El>Vq zq*$e^2Gec~zFq2JH>ftHia`NNe!u2#nw+8{p!b)2;sKxl5WA_{S z$ZQ}MTi$>c8VT$m4i1+d#AcmLlF;b|-^rq&*~7A=y5g@2(_B{KDM>de7d8zd+|kl* zgsE%5EiK?>5-vclmH1P%_8$0*P#*sgVwF;BZG&afc;xBD zW@Mlolz2~^*X_f9t>(OZ_>apHsM{5+;!`anm=3pPC0SraS>{% zl-G?}3}cszzjSCf(|1i!snnauOYm4;{ zG1M=2NyAMD%jG8t^qy_tyrM%Sk41t!h6YpLKH%-8OOV7Tu!%A#57R_%OAR`*zLAxNYVibkCa3;$uy!$zKCeT@j{>&FI+O$W449fQ#TD9 zUHaU?Qe$#_FvS`nBheqV__L?HTD{}!I1=puC8r%eJDI(D+XYD9A}Tn)IaX72h&bk9ntcP zP@^#3g)?Wv(`Dx1^uRnon0dvcj#|tnDjFF%`W^5AhhMS>@3C@7%6M&Wiec9Q` zNhB^Gel-t zN+8$CA>C%6r4`F*1!WAQBvH<2_5>P4KgV@7RaMEyDr2PC){t~=ibNi!PHWNW*Pr#+ zNTzJnDFK(}P2Gd40&PgVcP)iZX`*9}P4vNx#27x5)5Q!e13YYcBX=VpO6h)5D5|6$ zF$~eq_9MvYR}RLJGupi8QjXKm{ZT!B9&RT=4Xmw9w=H*+GnOYO)gvz?A#&XBA5%^v zzLte0EatMh%sSMw25Ux*Pw+BhcP#`w5X$ns(#<+ z&-PvEi6;Pnn7U`bMjjXe5b}?x(`MM3N%*9xUxDX`=vtu?>3IOUa-9UM7_F+B7ISBK2=YqF=xqnN#PhZHp_aE1zG?H3T0}=Q54)HQygKZ6z64NnW4~odwXjvwnrk4JW=rIw6ub`3Ox}sb$$p^Hs`Oq}@ zVPlLWH14J(r{Fi_MKid4tNq^^sbgY*R8EdT@rse3A)hQD9iuMyIJo$+wD|rB`n2er zv(um6By9H*g(`1<^dh{{(DGnbQ`@(dG!gLMX88mQbiRpPc7b_wAPGQXr#}XQSlqt& z;>;bPX9u}BG2!hFOi;y1E?@|}+mfW@8rek*B5O8w_u3&J)7gB;LqPnpijbvs#;vmF%G0c zf?whSL9gH992ZlPd!xS*?9fFPz6($slPfKGq5}h8C$pG(94f7UYy$8 z{&v|deXwh6OdoZeAe||_$WCsC@s02LUQSI(C+*fHdLZg!`Nn-eevzhLB6Y# z{D{K~B3mMx=a!Mz!Pe*3>6PQB`^S(?UIcmXt1`(mNf>bWYoWW__CxKtQaeul(VhJ*QCI`uIOUbTt+NqU@8_?-)iFM`jkrwbcgj`Zxs&T`mm)wH*mQmf zx!$M5loUM`$UE}a$;x8{N?`Mf`MT8wGn&6{3tX1vx{!bLu!sgq`zT-fc3kj#9DI)l#c5_ zC?*x4uVr@58<0G&8}ZOOoa01co-uh5JW4c3ZLG@lI{@hMI+^4z0V_93A@s|N&s$aG z`a109G8THUmEwX!{Ig6w+5iGG6gedG3KhJZ%LNa@I^WeKat;%Oz|%70A#5K!I|;N-+*?h*&KoR9-f&ElsXbD3ja?pV zjgYH15TL2In^`Up9RS=Z+;T{l34oe_=0p$9!KSFc21eI|0)Eb4djE+ExFE&~Gr+)j z9nY2I9U{37dVQO{shG|+nEUlp(bu7z_u(>&IlS+02`FIl4yoTb*Co+^AsR5Orn;0H zk#mvVE=~s8P|UJIx;xbM5P$*E)bpz9?6)}8ec(HU zmiwt0#il3p!s}T|cZ=IwTD~Co-**{!niVw?Zzef4_X$=fh;yCPQa^MnuOHuOREHeemxX<+vM|WAPX6Ic z#ULS=_y_d;vuOD5n_dUGVAV5*sC8dFI9?V(vSt=Cx&vt1<66sVG9hZHce(nz_F4&E z?{#?p?`Y~`Bt?XXg0eQ{5TS>MM|VigSL`~x2dif1FxSsOaN=eFbbvonQ)#VI>^KU! zQ28J$aL77>Fi0WD`3oIg?4=?qKSgQbleD8mk+h5($n?Y!Tg1kOgpHjYk!1L%om~lO zhE@9-Rj5~(%1r2f0B%#hh>{FOLA3~9NVRwk57w-RQ3nX?sQ99N3Z;Lx`I10>rN~tb zILDSIi@UjtdBq1K!6pf6e|zN5*pUxoO9`dD!{rcpoEEkdG};WhNE=T+Z2eX%Zk5YP z9=`q+KXS{KGdI5-(+&w9YRue{BMu|M`g3DvL)1o`;TXn0tPsBgyY{B#f4$ur>XLj4 zic8EGVl5$o#&C-6fxlNp9e|v!B&sKM?>GnSjIUuxRz#mRoak1V-3)P?7~SVjHwSUPZE(FO;(7p_u(pH&9sCrt&8W@c_>Reg z&qggE2MKXP>7D+hnQ-oeW=JYbCJ`B06tEKampPY-~{W-GW_jcDDF;duuC0XN`o-c~PaPRIN0o3#N+?$cB7JYJntDkLSnbqjJKg(U0G1`qeNrGOfXOuOr75~nQ1W4E_Xb?5%D>5Y?q#aj!KOJz-Hv@c(^ZF|=EW2IayZn@_JIvuN;I}6+v-7; z6}a2|@a_C)57`B_y?e>uz-Z&*efS1f;?AP;Q*<%aXfoi_^J zudCy7J9D}~Mip#An$h}{ywRrjbuL+zbeRtJMKKj?Lvv6H_oC(~RdOeX5>(PJk;xMY zX!M(|wtf2>BLHCHd%=PYD-+-{$KAZj6nOPhqsS!uykC7Aj=c4|EI4!?;!WbRWZ?$v zUHVB=xlRftRrtJDewNV$@f(!sakb-iNYsKUMSr|YTg=chH%&@*^K4I|g2fcjTbvGq zP`(#K3~e3dqJ>Bua22K~Sv95xAykEOpLK!Z7pAmqWC0w1^DIHf_F$w^9)02EnRsxY zwc_ZSz}ZCWaQ70i&2tl=uWbE<uMZrw_wSQt}-{}(n zn9bSI&!m^V`Wrh1J^DbdETu4HNzL_6S%`s4u~lco0pPW2ax)5YZR9fbr>T@M$R^0U z{ZGQ%%uTZ`#W0V)IgjX++zwnE2Gvk}A=WHbj#*PdHN2Fa0dl)5u|Mor1s5#nKr;kG zg?6=2M-IWhR#0<y zA_hg|P63gIXJ=XWrnHw3nWO4Q*iw($@Ii_)?`9Y#$aefe)YAGo=3>KW}&sisnqcm#T!tFDm^^Y z6MZ0Y4y!X#V)nI5RaF%?`s}N|177*Orfw#>OVsO}Hy798#NT&F^p9nfOVi#k*jQ83)%t3oN_cj?GM#~sqDJGt4}e6t}i2pi&bHT{3U@=GoTl(N9R zq;YapRy>eRw=yfd;6Vy z$e{hVO`UoiVWULsz~`MC31A%q9i3>;3iI6jyr7e85~=m+*-;Qa(Ju=5;wmOoU6 ztEa?09oVrJY#d}o;Z*+nHv|Vit5eI@FIa~BWu;$&V!%4x-2UJr9&m|4aAre+0*NZp zBOf<)QXBICBg0`cJ|_f212j(Ncy^LJQ(g<2UQ&I}|cPwKxbr`4J;{g=NOW`>w9?0Q_uV z28_U4m=T~1SO1DQrRKUUIrG z$1XO@33Z~XXllZy(`q4gghe7oqiAKhpKg+33w3Sm?9_=poWT|~;EMAf)W6zX@c7>YFS(V6qslw=-u9N-YWc|Co z7swRB(TH0!;gS)YOE8M6LVGt)i1?{c20rdmgh9Cx{f$Z(s1?Hxo)Y}3i+Z0AX!{Wt zIf!On9eaf^y;$gt-cv&=kr`nCKhZ7l<1H-Ix>UA^WC;=-&!M`Cjg=MdMKL7wqF>6a zO>B@Y<^LyV{Xg>vzvd9%*RRj}+N(FegmER)IM{6vp}GGi%?o^n+~9PBNTb!akw5W{qeHi;vGC!=iexM#KZV~X3uo{kV=1zz>KGW z_%b)7$W(T8g@deLsz{nKXh{Kz)onl=^9aeVXo571{EHoUR9$zw8I!VUNb6VF0N7m~ zF+{1tpo2KdQ+*e#M}{0w)V@ST{j=WUOtJ=a_v#6re!Lo5J(f~UsgCEF0C7#9{vdyX zL80T1-qGC z;R9vD55S1e&52GINHE}t(LeC9ei|m&=Vh!)mjHFJc1#))$D`%XY|Lvhp`@0oG9tXK zXM}cyv!KwbktxAxP6k4Z+5AQ=g6*cu2h_JUdxUacy63M&w1mi!Y2@f zUGDN` z2(;dSH37d8cd+6jQ58~leIQ2N7a_Sd+%oJR279k_MaP`5pV2I>VYku&6GZ~?!9_#F za0IW{X0bK{M}QbVw@U^e3}-j@#Es0(?hu4rK7tD1SDrj5y2e=9WjxWbN9B#Fi1F>mPoq#KwD7|4YxEbH$FyApFraLX+U)y0wO z|FOz}6Jhl#^kMK^g3cfbfYryHH`4%6Tf}x@d3hv#*HDLQq@xO!yO=YO>KJ^KZTTKb zkB5MrY!JR?^q;5v2CHgL%{&vjRg1-}&yFP$GO0BpR=?149J!=qKKCjS#nv% zsQ5Fe)HkuTe;aSmp0`?6BAFoD^gzOs5zjn1JA{^RV z_gI_0_bMA;Ixfx|ji`3#*ZePzGDHgpkME&4RrgCgvo9naeB#~`&~`I6^}-Qo(UVGB zFC)96Y$*>(!@LUYji5O@CxijjlZ`j)v5nJZJTt41ykLi)bzI(_WijW>TwgWBhy+@tg zJ!2#}2#ZbILypq?1R|G8Nft)-_anwt3OkDvTSN|2Mt&w%yUs%wH^LV?rG!J_jz=a} z^uF2__P3Pj2@-QvsZtAikA#&Mogtdh0=9y`UAey<78qsbMvtI;I$NnPV;rY^rJ{8T zXCY20U^Md=3>C4ri48SEl=6^BE}~k zi&`iWoLRG{1aPB!2(eMpD;G9!NQTQ%5IYXB#hoaTbXO5>3a?d*|J9m`g$9==NO&%+ zBbY>YVkU5IKv@Yra#R$Nq{&EKh^aX#5WA&Qqb`S|Aa_`T*;!emR=XrSfd(pZvkihzU^;kk@p*zXnumQ@UjrWuDr(o%PU~ynxk^A^Gl}y1i#Nj^~_G_z~`zc|tnTpP=naJLE4Q60uued# zD55%PcyXYe4CN)kf2zR$Gi3iy>FP0dN4p6L_iNZhU6zW!;vvisE`n)lyR z@TtLF)PpgE%d2LOQy415D9Q+PoRWS++o515UHuMUDSl<_PvMC_g1Xf`7tw7n>?Bu| zDCKSt-h{;4%=i`HDo4U5d@LzLn=*}!;ba7_dIa_{0+2d=XyPkg84ckMuHtS*gaPN+ zc)rGX1fZchXl_~WSP#*gA&7I)>3}U!;F^QjZ)teReU#LQ1N{0U`W#pEzxwSxAlC1o zV4rN@<;w1t*Upq|p_%&$kOaIna`!8i_dChsVvP6aaI0C0BEs#!D&9M0*E7hNkTf2| zC*6$7Rh$+22+%(>9E9YE|1!&Kvzvch=p_G9;E__b{svZFRW=yI6y;Bt47+~xeBWBt z4iGAnoczc(7!OCCba$~@7YKK=Ew{6}wz6yqH z>OWw8tOMk?6;G!LFI|{xtWV6)6B6=T$}qO?5GaA$S}or!LpI}quDn8!GB!ki+((3><1w2$3g>+oJk>8j+|$2v3ZmRQIj}h6nS%lnP*4p&?pC zAbP4+KQ57UAE@aCWo1@<=p02jV}LDX_S$+ErQJ1{ybmS1_B_|&vB;=x!=d*_xovS2yR9^Im+P!Emx7@;@$ zVxlYTMVop;`$wqfNVSv=qkDLP=%3pigf9E>7yXa6ONXDa z+rC~8<*2T!w}Qb{lA|3&yB6$B8}=qVOk~<9WpOlamS_HS1*#-G+!`dKF~yhue6SD!35Gi%(v(_c(Ug?TJ>WslHfsQyX{r6tl?|AYhgWvY0bj#mo+uG z=wQwG)hN#2#p2aUq-={=Lq7Z57}OnnY2ib+Z?PI1+)GDfXvI@+hng52RZ@0_4z4r;obgx>*A6X+|L$=~W_3@XU6d_`l<9!xLW^s5zH&;JdggizpsM0l~o-+rMv zLzAI_w9FR`Z~X4sf?F>~0Gdb$urx=3Mnp-^FMLVN7U&-NO(LRrH)5z-1WB2eplnJn%& z*)z`aXSR$*ejzk;k_&ea94A&pop@U*5kj7eMqrLVF1+#|VuXQ#@e8#NTgwo$ z4I@pN0e^f`0~OqBX7{0w?OZc`go|ohZ0L&GXW*`I*R)q7JME7S@kXE5tpk zMSIGs!K94@{d`$+@a2!_9hX8-A5G5pd$%?6!iy%p{y4ET?(=cgdvNKVGIqZKhK z?8qqRIbi(1i{*8_3KKs6vU_jfw^8pXZA%YxxY;+YCixq(DHQ42yXgUKBNne1!U;zv zjGxvy+pH-0Ld^{R6xaodd@+zy7Y7NFr++mq#vmY}V_~52KlP8fml2s<{)Y1tg4^@Lne%PslR3q1_7}bzc=vw z2LZ~!rN03QB5Euxj5|kpQ3`E@A$B#uDi@5F1e*GNOQqxU=JUx1FQ{{y_|URuYrn}2 zRu>so00hUZ(t)3VV#VgQ4(^_Ub%o%g(kRcm*XP)mjgjhVFk|+W=xffxKeMf|Ku=DT zwYS+gGmUk;N$|8}M8nwu~oS0|8yN9Pabw|rI#SiqhapXr4ASWGLpSuXD z>_wQ0Mk}yxbw|*&vV@G{=ZB?1eaez?H!8&h^(M|k2tNL}VRs9NiHDN9OwAKvQb|v= z0DnPuyrv)tirYEn!*Ck?I$m>M#c_Q}Vkh+NPJ0(X?zp+OZhB~;)+320fqBU{6jbL$ zeS+S5XwNr__@xX1+HEqmG0jiQ%cf^Y`qYeCMs33FkM`>PRdTmvWMLZfIL}g#iX#&H zC+@UA3`OQej|qrHgRP>lK&$!X+hT4yxk&|WfihCj0C-;;GDI;x@-&W7eUN{pncjbE zu_a7eFnk$n;e^97s`m|V+pJc|`@M*HmJBBi0L@ex@s++M#AnRK!Sj7f?)ZJLTy;bf ze`GNo28V6UQZEp9w~IB#3v0srqIl|k`^4W?c_d@}WMc8bA0Y>Y=6y^En2|?b38c=F z4riRCtUYVM%n8_UC*(_Nv<~>C!&eqwMpAM1$La!H(n`B6#h606oYRYQkudsE z&BnjDu*Fw^CDPM(-o+l(15 z2rdGKfk`V$bp|AHSB8vEwu6Is$=H086KgL}&t8*cc69aZ#r~VZ!R^{gT2niPu}82v zIYR(ih=)%A8ZH$OIIDoS{3TPC%6!b-c{9%d85?iJy}dTCr;>fsZ%^m>%kFEVDVuK+ z5djE}MO%Y@h9N?8-V;E+w#7@t%Tx_P8TtIHR`Y+G7*o;n@a#7Rq{4wXgSm{6wR<s$)>C1cyX2rUsuTGrOZ5t z>D6Tn|4!axqrgyP6*kGQM-Xt?e6c!h2;(o7yvgt6hE40(XR!sSW;Rsm?hMungGS_R z@Gr&-!?{a{0RfD_>8Qi+(>m8d1G2<7WHYN6)XK1^Qr8~(UkF>L?R-PoRVp>%Kw^%> zQ7a-XpdBl!LC~kpq}L*wp>+u}VY|sAB4Mp&k#G@K#5bh8#AjswS~-(2V3!8MUNwRKwBy2ya~Poyn(FeKPMHW)7% zClR*%UqWz1b3rALbFDV=mNg)LUFUT02`{eC*)9#rDog>Vh3Av)PW?~j_~mcr-=I_Y zzYwgbB6hxjbq=$c>$w#nxUUPkg63aSh*50f`oU<$!X*P+C|Y>Lep&bmtHxk?!R8yl zOVT0>{8(e4yK7nxxI5$H_H{1*8QB7Z8?vQDI?k#GvzUiQbV|YXT3YF`=<)b-uXjQBm`t{$Ntjk7tIkj(L9FTEpfQT}s z5WB2e9a#^`S81UbPMw5KZ28M=lLHz$xkEO_&wp2h=KLyzhF;J{c);Kiuwe0phv=hP zGYRcMF0ku0W1YdzmhnHtg(sC5)lG&!`UHVqkKKn6Cd1Nv4qD7L=!Mi%*6G1Enmtrz zU0n+w{RfqL5B^wpYi0hYq5@O_8%bm`jjx=J`^7u`35dwjRU0dj;C8X*g8t20*Q>ns z#@WM4n1AVf1#+^@9oy==LDydW;24|M&%dF$30an60`1F$y&)lJNgm5*7S}%&z;*POE(0Cc zlI!f=Sj)DK4(`QU?G{nOW0mBft>6`)i@#S)n6eOkWkLBN8@pm2hupj(59i#D0Tx2p zxC+4w@n#lxl+Fm|{FYDl=UaMp)!g86iR|u}djft>QzZ+ApkMcA3UIVuLA-;d5zAh+)#LzFmeg@a=y5lHIk0S(C&e1Rjm}tB~i(2jZ8lr$`gfb?5 zmC|WVG)lvK?{z?ar$A6)fFp0v_0LS>71P78}ClI@x|4dxPU`*&N8#9xf2K zhD!|*d6-czBg}w&^pmngq;KjtrJZxfuHt%w7AuI(jE0i2$ZKn|wl54Wc*yU`W1T$% zc$o?MS#6j%qYu1W$IAFK*7>2@;N5^87TfGP%T?lY$Olq^CVAxY04lLACJ6t`7+B%GTU!|&@_&vq?NJ33Gd;D`TW_9tV+ofKKDh{@vSsl$HZ8`nJEh3lEsyyZBn z&|m7M{Em1M4c3_!(iyC0(>r|!=90R)$T^+!zpa#$+dZ4v6ZUAR8NqL$J_SwMJ*}8^ zWMZ$${0)JCX!*z9OI#OQhG73S9>TBS08bIa2EYK$XCgt8czg*|$#4;e^g`;s#a}{f z907tP3lgWXNT^#GigXfqxMUHDo{{m*anLA(BCJI`ao@>AYWp^qJS9>kVA)x794Vv3 zEQd8M`JMn(EW*!_{bU$l7bE6V8YmWiIB4d0=Cut!5oFS%+J|qxaisHa z9~qe@iM4ft88_!a?VcW--ErM~4A5WLup!vk*p}Xx2jFlG9y21lu>*#;VEH(rN1v>1 zY+P&{79`a7%Hu>5J}%}3bJbm|2KeIXGf6Ps1mhW?Xxr%Lt=S{NF9fTuCAGUp zWE!t19_6E^q^Z9Qm@**CWb+CA?ndWdrs8q*yPj`8nX%!ZI#u<{ zqJRO-FAv{-SDhw~AqTH&UshZ=;8a!U>55@&qD<^WSx~1B52D;A#XDa(hm(c|E-O2` zEUbKl={YRCe1t&#?2+P|WO4YB+pY)Y0oYan6v`Y%jm4AqhzlF1^k@JptS{Il ztgLZIz~}J+%(Jx^Q#TW3W?;Hy%t|MnG{}of<8!uKGu3eEvFsK@;946Yl~F$Re~#Ec z#t0^1rg+7VFd<$pR*?iYD)i|G2wf3E?ZAmXvA+)!%m&R;9LYcJ&o!kP zi`Fr==Poyl6fLQ0&7#ZX781l9)Et|dU;6=+f^;UP)@qFY-grUm;RPWa9$vC(nET23 zGMzs1iV?UK?Q!@h>%*e6P&e~%;S+b>dLVJVjF}>*9;M|gW#OrHd+*UW^A^JDeum`PSsbk>k`l`&q8ld@s#ITbr;$ zeN6t6N&drIcfI55oU{AwR)FLCts1S_M12B&YE{P-PRm~MnWBPT4zmq;n93>LuUVIk zAF@1;Lx38T?ALdTPH+FLT&vr33%cSv8ZLaZW`?-){hPs|CuSbO_qm&VmmTu!4=g{Zp`DJ%?bA6Y$mh{9cHDMg7IrFOV--nt(Jke+*C%`-oTv4oGswr5FQ(PHFn6^_#D~6Qszh_uJ^vN}G=IYfHTHRL6hTwo%!Z=ozfK#AK~dfuV6vX&@)u()owDcFDfOD7uIB<88RfauVb+JxV5qA znbao9UqYR$taNMcSy?=duix3RzPC>jq$+VVeoQf9HX-hV_NiLVTd~Vnp0uODiymI; z_{8gb%C;^E2HNl4Tv;y*^m8|Yq!?c{;q=_lhGJ~3a|v_zcHEPYw4px1M}hf$fqi`B zsyR^jh|zw0<5 z1tsA=Bsq9~8-49y8tII2=D*v<1B;!Tm{cIjY;_&<>(6RldiAV8pxdtPHT{;|IjY3gyUt> zQAfz?*KC(d3#^Dd%cjEWhiq(aKy)2Lrx}Cp?o%YZ&TKGpF$rbx`ne zsq?CT3rhf|(^4^iO{u1}i?6&MX8Xt(OTg9^SGQk}uUwv6N!E-hl#FfaQ-3E9Bt`q} z7RD!DzMwo@mNa`TVI8tNdo96Pv9aq+T8oJbO9%#jgfi8k;fxtnQC^aJ4FukPrjw^T z^QfxlR${K>k-%19ip&wJbLcfx4;fj+F_fda(PTdg;exrQmYolE-HV6%9240r06iWvho|Urr=ccR4?a} zi4QAn9L~?OV(g2713>I+DT&-dmx4K<>{mxYrFs$&|idJNz72KWC@V|97_y=0_&=r(?8At*1hC7AxL23yS~k6rDPc zPn@GMso#x_)=(%}Olu?D{CkBBsg4^Nr|Y&T^UG?#ztAZx%@;S~4PAb+Lfx>2272wHFb7mc9ifzX1^NCn-y<_>45bKWnb9OlR_`@~<2elJ9J{M`T=He6P z)Zc%lYk8EIzCoYcV%%xa&f#WL?dz@9B#2RLY1$!sZ402Sdq^wUD=6PO7Zv1eIJrRK zH|Z9b5O|8i1%_MH*vIY#Fye@NTC5IIC8Z=yVQ?RtI_y!ZeR-pf&f*}nUfg&xc(r#>CygkbI&ERC!9~K&s<^ICDCfPe^^pF3KVxp0 z^)8actz4N|tD{wJH2cQAPf1qLpeK#R#6TRnjSkaGnxya1bDnoacAe#HX+Nf_V@T*h z>85bN^9!W3GY;z#6*99N;mAuSrhfMkgN_ezTl6I;lN;1n}mhiPs0{|jasur)%RjRgNVnl3JL-(@ECnZIG_H$ zak@{)m!RD>DHDMqZ*zCM@QO~OPHr_hHU-2D3wOIWZl%9KzyK5akfFwwFy_zD=tKH1 zNl0-KyAXopzjba}ZSs{K+LK$p`9yPl^A2~{;Q`cK&Y-b>MnatKzj#f=*>upc$1+)O zaOFWay+~*EDk8^r^|jm%>q6eA_~|vsw;t&5qRlt5*$N9^H|a=!>~`Mu8YNB=;@P0o zxE?DqaSGIY?iXTNnMu~#!jlN|%{J*(Crbo{tn53B;r5p7FW0%)dcr8xmp6><0g<2J zi2&DAh#+(6p@?8Z2mj=~m=Q4XG>n-=NABZWZDZ@pwv(x{j`&@gyjJ-AM>vG>C zDT!uc%*$l8Pn-|)#23MVW;>lUoMnlos#Eu4sPO2hB4}S#;oOX`{r*Hu*R2$=@Unyi z`iBvm4RDT*^gMt$Sa3oHB)>78x~?TE)|n&*XNh%(K7UXe)&(Su{lH>MA!Bp={2%is z#05Y7mFNFxLD~mjTN9td1jn8v9;b?8iMEMx^;N;!K(iwKBt=w~7>9jea#eUvu8&&y ziz=F30+YVvg1V-CM86LC1Ru+mSn9x1^rMqIkM*7q$x~tEK665KlBoh{{(_IHc)qyb z%&5L@_i?vLj5L2lf&h&;DQqk6`{Y?9faJHd-2Dd}B={~Szv_K`+-(>eSrlb)pQP}P zV1$Y@6tW}?`JmZTH7Kl$#rWQ9#XIGNJgrb3pf>ZE-jrJSH>V3c7=EC7WpO-6kxN-e zjn!Gz;cWAaG|7v8fEx*r{gx|f*HNcH-`Dm|6Y zbzf;%tnC_3Yw$;GWM3do#YuWU?@_NS_UN}5(3r2XVHdJZnC!XtEyS_$C%Kg$HxcM^ z^Lv&i+*e-7`FhRinB(LJXl@v=$y4GLn9zTzwypAOu*JvF#=WaKJh#JKt=EtONjd4? z+a2Q}$~)M^TJ8&)AGr5j+BhIT>u`o=5_Nx?)rivYn*hov-sB`;JRzG}go*nVCAnql$hJ<-O>e-1w9%lNMiJ???oPILYY)5j}qA4NPxQt9umLW{_ z)~nu-xzOo$Yu9pc+?X)Tpisz8(JR?hJ&#;iwg_!Dna(;lb5RIyRWQfT@`I$nVAq~& z=)|s?ur^^q5qsF;*oflYEI(he>7tpXy-!jRxGw48I_Pc<#1pUxo_;Zq#2-v7GpH2s$rOF$s&cu zo5DV^?|L$JOjl$d14}ZLBsQ_mJh>^yBu{Ehm~6bA2gBVPT}7syy!435ddYSWF`9lR z?wOfovjg0>i|7+i58r{4oNE9{oZEE-4=QrfjT%9dHw>Q9;@d#}M+;!IBT?yW*Z3F4 zZF|oIX@W9IEZpC|C0770@pOZ{R_n?T-M)Q_y^iPK#Y!o$co59i7cND|pDV*hkt=oBzCBXr4r(~rd5hiD~N6d$Ye!{N6_ zua+To8aC&o`NCL!w|g)x!3)XvjbbMOJp z3`&1Vh$_6|_)+IEhN2W(>#OrK!z#)wJ)M})L)BP1&z%tW)bzz*Pz4}Sxg>5s{$Q;x zI?;06SMReCKUBR2r|R_#e-N!{N(XEC4o}X|Y|aKb{K&U+Y6TxW>a7mo+oEjYIgdUCY{`M-M1j1M;?ng3UA{I5fu z+I5;A+$=PF`_;FOYy`ZfTUQKjDSe#$`1p8B#oa(rQ?pOMCd}o24!7e~G;ocJyJcw1 z-$_X+$*^{L$Xxo-EBJ>XnXXCWYGSpey++|Tl;272&>_&JDLx7IK>GC2`eYGNw0BYG z1|#DS1(Zm1JuQ@F491o~O9GFjOAq^aa$+};`v??4PLvF^Jn>R$^v~28#MZcoqKYkj z+<4AOvd1aHr(&(#+^v*7PZE-nLlbTTk6z#5;xV!Di#9s=DmMor0^Hr*lT5R2Nrvul zmWv0vtrFgBIm-Kd`zxzspX=EormE{k&Fe4qmCj;cXRMb~pg`#bAv5@O`vRbxnY#J1 zIbkxOc46WGrCFTivRUetYPU@veKXulP}na0x-~VKe6Q{?j4NTARBJiK9ymTgel6V? z^oAiUPNbQbMh9zmzC?_ z3(2>;4#}VE(QkH!f5`=g#llWG@L}O%Tr3Ekd7FQO{qDEgT|)`Q`BsE^U%JO7EVel5 zmX)c}0gtsb@qpwkcQwqHjnpHc{w_pQNli4i<4+iIbM50^WR)7+d`by_nT?BGaM7_Q zj)?gO|Fei`;z?|&K%ojS`>?jJ^bwH$n)R*jB0O|aSw*D`Br!OCa(CSjsjz#(u4m|e zmH49WU2|m1F-Lqq@VM?6=D?L@KDNF6P{|^AmKcl-_mA;|uzDMIj4@~{+&~T)zoWq& zBhUeUJ3)ZtpK6BxzOL(r{1|XzZOk7smWiG$IyoI-3A+@Jr(RA+uk<)lV(}9%a2dsU z+}Iw^jSjaKN=qcuKC{1Qm$r-?t13&IU|Gu=xHKjKq{sYL^cYA?*NQA0LaE_3^c+Di zKiZOE>YG)4_r=dN)G|3xA$|!%w3v|FX?5AojVeeUbKJ$@*l?}^yv`(54V;a zD94Wr(anN-?#cqcxWMXj%eT)py?0NNT06tm>g_ksziIBPC$5mSI9%dexVVj}TPUvz zwD29bi}}+_T0L(t&6}Q_k2e|u(sO)_iTP3x_~9@4yqhAdmz5GD(u~v=jA5r*P}K@O zuD$G{9~7c%`)US?`2#s&0jdH#cvmPdT6DUh)41BTacnkbxm7+}tt>3D>T_?8R|$^6 z6xvHodc0PY^!Y1)V#O+E=3R8yY&5Lc;NKQ-tBMylJy^4NH)VL+h3Y&8)vv2dfZBPr zrnpd1$#eUUUGOK%0v&|W+2fLFLaFVZVJfrx z-R^2fXVVW&z9j$a$zo>tR%Bk#ssU^c`@XKP&OFTM;hdb3dl)sJH{4iNpQ*&`SA^@M zP}9XC<6x7b?A0Wd;zmN*%wML#w=6dQ>}eiGU~kP-^g56>54#C82T@iPF5qEGT|V@1 zxZIL+rb)BElBQ54TA>iM-_GjHuDHA{v`GUGX)>v|dnLLYHqzttnvr8IqC=g{pjZN>W5A^sY$|A7%#If`mIq#@sJ+8 zOKKU=1?lGr+l`oGm0sPMirZ^)M_{lkWa`TJHP8AD_EGJ$?qE6PmU$>yqH0ZRs;8M) zUeRlDeD1cBf1!Re?_E&q%*dREha=MrMeF9}#ujlL0ExVlFvc$vLGiH3`fIUeEy%%6 zhw}|h=j)681<52F%09)^`xF}TL>7U9wtec2t<1%`Pw2wz#ePxy%~yObFY68((9Ta} zRd7fKXLWD_)O1j4{~s^@?;om3;Y{_-BGz56yfBDX1mClO1qDJ+J(y3Pj<-XMWD5=6 zUL>H&OzJpwlwkN8*mBr|`f zEq4(S5!LdB40n&0A$}eyqdg-D!pfo|CAeW_#YE~FZIo&&8yl7FMpjlMCYwXJx7T~6#(^6H;|V{=Ad+m`iqf?`#cv>(6l(!c3U1iLDruA<(!V3X?Ue%s( zL!9~(4t&LBE^S8R*ojTFIo#V4Tg=NYGLTL|XgLbPx+*f|sHkxYjrA^#o-YzlaFgyJ@@0=_ z>U4aAp!q{hTYcH#dLuy#@haME;ou&5b8nkb6uFC~0TlZ~92SdCzo+1(HQ@03qJ~^o zLs_}f(sa{`R(mvKLYW<-L6XyPPPymjre;+uM!<0%Q! zKfv&R)rHq&eXvKP`mI#PT zlIY@+Hg)nk<08wX=6PP@`>jQ++h;bg?HD(zB7vyG$k}w}+?Y}B3NQJ%C^ubbUCD&43q$8| zpB~c8{v95E8(P`SQC`yV`oSKJ+sWqj%thXDlrB7rTl6J|KQ(U8kBEPmxcg8;xOMS@ zC}m#YZQTk4^DsIy$iAO4Gi9ZWty4rN(71r$sc{$S+^43>`?{Sl_wg8jet4cKMqp-h01nB6@G0BVyo+st$=yA82tcq#SwkRxF4tAuTpV7bjG0ZVh zYVyxA=4T$yU&I2vQZ?CtMi{n3Rj^Ga5Z%eFuM5@b7 z^l@=PIOrYzizC{^nbDS}`v>>0E;L3hUjMk9LFLm{btDBUD@Wd^A0v;NBvH!L6+Rai zKi5yrNl}UysQZXf+NHW>Kvg2To0HA>Up{|zY#{eTN`b9^pT=M-ObJDR5aSaH^&S zlt1e4=m*kNjzvsM&HYb$RJ{fp3Y!6WMTEh~b|rqgZxUK8o1-_qBtwQx?bdVZK$UMr z?C7!e3I)8mNFiqNcwckF^hA(P4YF))@lc%`@3O-(y<3^55y(K^O!C~W);IA{M5&V& zTmGu}EJ=@Fh`q?&r(ZtZe}g_;?>?RQKAfRo&;*4jNHA1BrR2h-YD1P zS`kD{ML&ur3fK_9??FGkiJ_DyIBPt$7lD0j9A7mh{j^4EobKy%duk>S66%#GXTyxD zVaSp`gAc%t*a|1K_3`1aZ*;QVB%T}W>Cny*g*yyV!&B{ZT3uO5;y5o_U?W4dG~OKl zhB@U_dvW&ZT*b?)LZ7S4YNf*fx3T|Mpt}bsFDJBdk!6oKbf)qa3J@~fW|P!Lc@PFQ z^@gImfT(f1H`&*BXq^B|!Wfw4&BR6o%(BcnD!L1=o2){?_Jm=#$4smgCg5emu99E_ zXQ#TM#+ijDClW#nPAKUXWWkM@NWN6O6_T$i>!o@I;%F-Iu22*-@h!=n3MciMzNDok{4~ej-P*YoQ z#)L6cM(WLRj&G%kCD%mt?Wqq23R?bS!xIda1|A%Fg0?H>swG|NwwHM&F$-!*faPEH z^8dxff_|0z2QIXCtF>xbbad{|9@bSC~v-;?tF&bBM{i@66+G``(VTj;}7;0|KMJx<@J=+#_IJ6qgM%qv9_ zZYtcUwvzf?X^!C`^~{(r(D#R7wHBxmhy!Z5Y~Liw1iECL?6e<03b|$FL$GvbXPwe< z!f{K|o(?gd)m~j%&~1F5FzE$3`9iv-ghiZ7qNQaHz3f~AMJ#ZJ6kEe_o<&NYZjZ{R zh8dUE@;LP}O5JCb6cx1lCQ?Y|?6PCxqDzHr>Ce6){uBg}!FkStE(IzXOJzwm3!YQh%5K0RoKOarGI8 zW@b?Bo3&_&SA}S4D`=W5ikaSdn|}Wew^}(m{p#HrdlQC#b%(a4t>(e|jS2G!)$G;7 zMA(S4zR~4+CJq^T-&s}F(B9BcagS=-y+1qjEIK;cKFb<-ePQKn#=a`~*xsj`@2&Ra}fhYQ;!t9L(iCqxC0gMmD@quDhhQi$#X`zRAphCo_uW({PgClNw?-b zH61lI8O0*!m}M(yKEks^7Z*|)^AjI`D53S`sTmHpTV}b^yy0p~)<87guRqPTr-i2E z2bJrm!lt=#5HCp_l?E>|K&vG&k&G-Q88<#(*iM(hVoj7K(6t!$aAk4<%ds%*07v!l zyt7Pwdv>J*S3XldDC&E0x3ARZ;O|em+oCJlz!~Zr3{6%H}pD|n!^YyaDW-jZp*#n<)4B^W^wY%w3W?C!q7tvcTL2Qc{ooOIUFR;x>Ua1#6Tb3_WLp!*eXv? zSTx2hTIX-Q%W!#JV{?bZ?5Yb3CfS&Ei22-<+DO%jXFf)Rhr3NTO0Wv8j#@pb1u9=K2Ck?EQi)T@D z3mCulBfREj)`aQ#KbY>KWjkz7+N<(CY&N5Nv@mofH22YkWLDVjB;k1-?eb=v|6GqIH&X1RZ?hlF5p;lKk1~axD7%U7mcT@2C1Wi0l`}1~j@3p<-0fh6#Wu;VJj=j?c792b?4`1)-X|MRejB{PizId(4O>`ux7X%-m(8|6XE;3G zB4IO z=6u+MUtUbQ2VGlK5vm!(H&tauja^3(Sefly?WgUncJthp@8nSsW@f;EmJ~Zy{3dZT zM$!8O!z=W_Oi$NjYrPr}bF>V#1P+2X0N~i%w8Wl@2>+^XenRdVjr7BEbx1d3kBesg z58^TE=Sx0d%#=2?V3~NA0IfpM!_{vuPjyZ-Cu6G^XLM z%lnvd!3YTt4^0ELKG6FE*2&pX4z#ZD+KaK)3neazFuztpF=ahLpZI)8Pd+s!=&Gp$ zdsS)MZVfB}_VQZ&_SXMZTUkek009vZh(C-*Lf2?9LZ74tw5h^gj%8sq+7^xaOiWmudS>s5`vhAS`*U%crx+t6X%TK zgPZSi+ckeuN6G~LfXexIBh2BE~~S=i=qIBEO0q6S9Bur7q4eDr!IC2n_?AyOB%*V@)Ry3WQ^^jk3h z-VjJd3)KvaRa1Lb$E;wwc(b~MJ2!bN+gVHd;4k~{=KSCPo|g7CB@c4@^Y9^Nqryz1 z6}(zM$!A_G^6E1k!)puf1rL>DF*hD{PE~-Mz%5lm`?zW8xMgsE~15e@a0RuP7LH_Go=GDx2tHkCef1=H7km zP$%3P1>@2_+`ZZhXtlu#!>^vG95E;7;8|!rG9j-$tVZKfvjg=ZUBN?;dNj1Nu2n9jJ#I@B z9cO#-^T9o`D2k0C!F4}MVx97^r)SwJEhS&mT;m{@!{MoR0g^-$%AqM_DKPqH7%|0mn7w9{5jiU zjcw-YIBToGG_T^=>Ev)N@A~vPqir5EQVbSiVe{VgX&)V{Ce2mtZ*3e4);$XL%PXRq zSQU-5$fUAWOx{E|@zCY`yaGH@6>9mC z>10mQGuS`pUS>b13{0bpdj}}TMid`3n>rE@2W%h9khf)6RdF#62nJiMsnq77MMkx4*OzZ}1!{_W znh84H6%G4(v7>#Z4aL$)#eBKTL6G;W4$*Bu#wWXa_ndlk^%?u4tf`Eh3k;{Y4)fG9s~?J*@1GbCJP zB)zBkN7W3*Z7gGARLw%{o*Poc(e5s}p*Ejalxm_s#)q-wSDm^WOD&)HqDFok;lpgH zi?T9`QDEAr1rz6@T7z%Tgp>lgA>2JP86($%*8>cbi)0pt!*7$wKmBwmP$VPVCEJm+qd3sPFLbVh;Z z<|_M~!lXhIzE;35&w*yC_0`WuSa4;O6f{I+i^9CG78g`)!_$!{XJ?dXau%eL7CAfo zL+2Zlo-gvHDIXcd@=(crXoMWt(=xCug}M^8RcN)UMz$4vyZ{?KoSgYaH~HQh%oc{{ zpHZh9E-w{S2Zx+_%)$>bzO0%Bh>|Z94fY+Q;n|=rA0I28=b(h0)PAlCK67CTdg<^X zFQ?h)0$}rUa}S^NQIKcT7_?B_&?OS*_5sdl+VGL!5bqY132B;ohda$Bv_wUlhravGvGMvV6v(P3Y?8y$>F6}w@Ra?r3&Rl!DUVe(5oUmDj71#9S zw9p9k^oUokA!4xlX<5@~W&rpFWlfR# z2jBja((q5W@?W7>9TsMl`XUqIiKE}YMje+)#L!Y~wGrav_(fN!RB0%l-)Yx zZ{4a?E5;Z%^>+H64K#(#gL;SxMVoFZg*N`aCNB=2I1OtmPa-NZe95lnS1w4eAjj=9 zmuUO(^JzBt)~{2kM4Lc+=6XbYa2RP_RmYPY$I8UQTuS(f&HpAu@hN5JJY@Ji|DxM{ zh0=+m0u`eO7BH(Y@J08#MQutOi_Gb~-3e3+E^s{*sU8l_=d0#TMx;0U>&ybs@HEnFSxad^s znk+A7={m;{;{s*1aSMZdZeR|K^p|b;O|P7s<#pwfQU^COY+Iso=}c#ha2*@+i|t7< zz$b82<47wScGY>M5Dn%`q#eQ4md@CL?%Y8J{(Bu3EQ>t>!j}b!))cG$dtRO3Ph5`_ zY_!ul<3D+ajKtFRCFqQd&{97A#S*>!D)@YOk{h=6yx#_Tuu7wDEVF6P(x^fZ|%aP9k5qv(-Frs_SG z&JNM$C^L;y=3ge_Mrw84kK=jE9>)~xA1bOwEZG?O8 zP>b*Wo0F)ff@Wo6=K;^rLe*4m5W02ffU%0qeen}$ECxPl3BpHeT zyD<~A7%c<^UxFs_MN9)cKpRb|YkxmrVx*@*vU=_(R3m%i(8dp&B($jn);D3WBOUN- zr9SaV)RUU1v(DAOtc8W!(Z&-TR%oR^0)7B4XbgG*eKf`*PE9{Ja}TiemuJgV9Wz{T zadEdei!M+<`0-QT4wy8Qa2N3Y=5L0{_3AI1&7Z|;D|PY$xVN`Vs;l!Dvs!0(^4nCF zyy%%O+=FtNoNYqu8|BZQxR~!l2OBNe-V1=!6?oZ_5^L2?up`>MzP?kTSx^h$SYAn> z8YzULl#@>fH7*G3>=DZGA{13qhrUCR2YHk&2reD)9;Mmjw$oc2+wr*H@S$BNgx!ewQNX02dP!apo))HE)5c+niYHN=N=(zXExqw{UQAqvi+gfM zo>4?j;Gur8N_R!@u&KQ06Xx;JF-X@dx7GKnQHpqO#G27`6!jyG}p_H&u);!4v3g|s)?fMJ{`tutFNE)F%nD*Xu_322j#s@3Pa zS4CVJs{Q$SZq)Bt^XE|3WU!h}?uEKv$-PD07(!V#YN#cx8}Hty-ZAVdpfLEH9H|%| z#gU>XL=hKU9qdVqxh{c6>$P0{%Zk?ZJbR%9g@WciZ0^h)kF;s(;@+>CxU10@e=kBw zy7=vLxBWM^-f$^VZLCGnnJF3lG^ZYX>Q(It8xnEiYWHZ`1CI^`nCgoYR_{0O0CK3# zH|JZ}>ahNwC@KbhWa~J$8TSL-DDY;oxHJTGAMi!{pO%N}iVnQA*^F1B7t(_NxZ3^t zDfOzTi!Kf;jqJyFFQ>3kp|~$Nz+y?>CqzRksR#6Y46}vSSEETC5^uz13o`_!!gT_0+k&q*>vycHRO23LMGBtbq7?W=u-kFqcZYZR9BP!CPFip+O3VgKR*phQ zNaa>l?4NZS0^ox7H;{c~W!4^0qehIiN^Ie;$H3u&eZ9*Oyxr3f4NZBqA4(r(eD?ir zEE5@esB#Ub^~iJQaPt^ooD0$dj!}1K3UmZ8CVCckIO?8=?Np~yzUL@D=;HC>gzsMVi;M?V+zNcQTz&cJrOea|5l4Fb zAHWpRL(ix`DOvav>q)&d+4D0vR>J+H2(~&Wq)*u1?_&;8XNBioBaJ^a1JxmGZJL|@ z5+1M5cQMVSx2-WSi!G5sSpjw@055jYCH9?yxl8b+aB0V*No~T`eKTjL@5Emq0-5nG z6mj+&Kibu$u6YT#6UNtnO<4Io=#H-UPs47c4Mg43+EPq(r#}$N|IUuIk1_!m9Uh{|v+_OM5y7_|;USwUv|ehG-iqTTj1mt4 z4ZHN%n(oL;PvvWCprGo8pxbMhcVhOf$@V!FtW3!bk><3tNWMQ4VU*htp;a9=-!ILg z^`J56RuDmNzrJr9PDJ}fz(8{&Li?k}e#~vfK+%BG-yg;m_4ohub$)<^n|Bn@h#6Wt zadWnbtZ1b772pp+{$<4cehOz-=5L#{0jNLOYEfL%`^Vp>3rsEb_WbBKqNmTXQ-x#D zmV^fl8mu~?H7Kc+G%T9xpUG>cp&d6?%Qr7ir7nBDr207Yh}Qz(2M6er$gv)iZOiPZ z6LCSqp2H-sjNG~y-R^Sw0=9dT%>KZGsbD!bX<^-*O%t3QSy}pMt3x+{3MHDCU zjIQ*)^!|W+Ab@jjcN_cGsuC7sW%5SdNMBhBb(8HA8?3%NEC=}|NRz|GqZVG|+k>^zX>U-=NdUdTO!-wRGPVse@ z?j-CL@q6{dfY4g98!lm5kgLtR4<`PkIh01p6lD>^Rofvxwk<*LXbJhaGGJmN_>@&s!t*08L`0I(*evZ9 z9MMfw(fzgn>39s#AdT&F9vafb+I3%?Mn#0TKnvzg==3klV&DJJdq(iAZTrgZ=;Ijh zfCr~vZ+x}wHktvcOOW;N@_{Qsw<#&zIS&2Xc0(;~cob`cJOt<~&Q^d-zi?jy?$PW9 zMX(Q!d|wzszEg%bZBSk@bM!{`@8&q4y3=r3Q19P$o;`I-pbw1=ri+Sj_cR+c zy4|vC2RgQ9t;(gngp2=R-hAH^3izG(&<=2f(Ktn9h-(;>^1E4vLCm;ji$^|ZIqr?P zWNA5z?f~XWRm~Tq07tknkq$jNMx{vgSuLReT^ky8p-;Q1wT&^QdLvPU*{Q8I>Jyi( zUY!~~7b8kzLm$TnfrjmApk1Rkfk^_dn|=1^(rGr^Av^m=>-(@J zIB`A^SAT-MT39rM(+C@tnU0!dDZ*{A_M>Vv;bQ9J8YJ~7Ra65rH?_`!g()J~+SSs& zH+CM1-7>0Bap~A(rWZc$bFW!{%^;8r;@5e40hWL#YTD*rZ$dCG;_m=pplKxTAGm=T z|CLvM@-}Dq8#__LA1B0bmH-k7j1@JGqZ{5F-ikgWLxm$7`$)O&nR{_=0#FfgcwcX! z%=ajolAs%ZXDe4FOz1EBc1n_tT1Yu5T_8qIl=4|(hHT1Zk#u&eQT8K4;y_lj#WlH$ zD2nP-?C5aek=$XEN|dC^y{U=hj6h!Y2OQ)$V~V91GylXlmXJ*wLrgG(`HpwTA;$D{ zHutAYVXcFM)taawWmH^4VPbmg&ESv%!e(e~k>jpStrDm<+lI?snB*-!j}Sz*@^W1f z?yf8PIO7l_-Ctl-QJDk(XrYO#@{tGD2P`dXC;2(a`-zq|(WXLERO|*%Ol=){i!)x- zOJkO)xyMcV%H6;)@U@`ppO5E%9a4$7udV6(3+7HRrdN4XD)PYGE_(e}SOoup%lzAR zIhfhCqUkz0zWDv z-%c?2T=+URZeBs+2VtDLwnnHcEo{!LAFvB5Gc&nHjMJz9Rai?D{UW0U5%s1cIu1+H ztUtd^(_sO>cxqZU?tGz_g8GuFv~)_OB9%y?fXPz3Ss9UGcYGvmS+@{>SD8RyQ=x*W zPK(*lc%flkhf)oUeW)C7N$I@^QP+-8gUT1kEM2!3?DgJN|D+-8Sg6~Wv5EhI`m z1pV1^h%^p4_$B73j7=Q-eaH}uk#3|rDFYyu?9dA?MTum5Hw9ZxjA)Z!Zd(45dN4JQ zb4>6H29e5Rh_&oy9~A@Y5arUBOowm%PD6Uz&)A|pBy9TrF^?p?`83SUy@?HFdv`Ph ztVhUa&J>Bsy`RqYTsCPdM(2Ba1`t+jW$jd4lG8rKwiIN_b4upaq1Ju9G0wRAc1P$UhPS;Rp`D%P>VI;L29;_eTW{LBnRAgl@ zqP~X*mhis)10p}rzfSR5TKS>jx?aCUh?VMgvQYKJur1Zc*1T4B>ZyHU^T`G=3}ONR zkgnlvu>^M+pN0iFRSAhyFr!j7Vs5`^kv5|X7ma_+Aw!iOHZ5-7RSAuN+21nlD79o` z@{x^}rCMmuNcBAnbE+*&pqvLmv}70kqbj_bb0+y-ubDw7XQBIUsIlJVS8A z%%Wz$qJ!xmQ0!T?Na&Vqang|z+Gsns;zAD#^geEF{vfA5r=la-7`qW~j!1xW9wk2w zehHZCJUw==YI*J+a1wx%${VAnY*w4#%J_ON!5wb`G^|%2>IEu%m(5D!Q^fo@Ch#C& z;Wknxaq6jB@v+7(`Md1Fl1bf?Xk#dIMW{LmB5sA6G_R_LCOg5cost^K>5)L!*V(RI z(0&ABiN5mM%6&NJVs2gHR6JFqvR4mZ3}Szc>Mk?A4XQHg9Ym8RJH+0a-=Q z5WatjSotN02;M85x0-JF<|DLN*!O%|%B1HnE0AbWp+A4C*%LLg??fH0ky_rsjTZG0 z?Y{nE=y1zxXuF?7rc6~c3^D3v-q0cAj3XsemxlD76+}cA#XRam9h<0z#$Nx>P+KcY zpI0!VVHjVXaK{rv&(DYuhu#)@sgDOOs7H?WIUP&nZm#B$8K!IRywsWoaTRwSP8Hgr zziL|ROaH$8Y85dl;_Vu4Y(G&o+WXLj{JZ7F0~I^BBy5oX#*?fd}aEU$Y&11kXYVRkyo#|_~+?7Md9{4w7`F@ssC=b%bq~!T59VO$aybnJhMlW z zoBH)@qKyxo@;Gilwp5fER8g9Dt;sGQj(joK$c_mdMJ7UBkj9)MH)XSKGhj)$Pd5q` z9|U%SbuG+u$H#BnAHTi}6c>b6eM8$vE0qJ6(j|!h-Ixwg&&=|vXW!n7ZoFHFlp&#?XdybHc^!3NFn3*%G2F03P*j_Q5B$+@)p-)MUi zXn#?b_$ehro9yXVm}M^lU2b%VbfM+`1_u($=RK86dPGfWpuU;A&OcLW7@NWhA$$)v zD8LMMcR)gq|FL6wO3u^H;5gf$G$sAyJ;k%7`d0RIu7~h15kRmIT4n84gZlv)tXtU6 zJgiH#(QMlJVBK<7L1a90W5tYRy(R)cQQsq(Se2j?cqu@8J*KK@Y~}NSxHcGeKb%%M zWcKreW=Th`R*l~0kZX4i2zc`y5SC=Qqn2qT zE4~h#&U&HP`NM8o5Lhu{*R=vdj z^?JqAF>*iyBJbA`?+#9M5obIexH_HsW0%hl7`}r>Ne&XcfA6{9SJcVO)q2W%KP{8U z1gi0Uz}LQ?m5YUM#t_^rgkR z>@oHOa8FSgGI*$|Q~K{4Z6>riRZnhHJFX2E&-`4C=aN|+o1V5*KM+ixW-64@wOT~A z=%!a8KxU4F8P}@nO}kU_6@TX_SyP+g?@aUD^NS{n$7(}c2(9#~jRD6aev`)7;CenRJqD%uyP-!rI(JbLHMOALgaP$mZBf;+ z@WFbS6s5)2Jnp_G9tTfD#(loj?z%_g^>M{?>cK9RUem|q7Zg@zz74!}vuu1>jSPqT zKsi=T#moE?&)g>^T|h-!qikawHTcTux7Vf|1?s5Rf|^?8CB~s6+ByzYCMyYR*yBI0 zpjxGeEh6akWMph)ua!2EaaLvomP8LbN|hWz+tu*_E_MOhG;}_ekIQ@6B%&l;b}aT} zCCCa!zTwLMi5!6uX82^;VDK0f`JW6u1Q0`yHdNNE<(y3+nDYu>)E!OlKLXRgtze%; ze;v10LcUdcga)Mo6gVgrglhh^aCsFSaZx0Wh=84}v+F@acW+n#Tnf%OqAcfs$vAQYON%tew`dlWa`*NksEyd*Akhjbtw;u|h<^Z3b zJ58+`t_^4)CiTP1Nfpdu`+MG*S&)=)Z!gZ$NWP#P_|;G@OdcdpT)863Uz89|`xYPJ zouaBLT*GfEi7MZ?7Z=(AKn&H?XX?khH@Y)ZX@%&CPj4~bZob@_lA(5=)nfE9YA#?l zL<&2Mn95#PJ#39yx9yiBi0>O#J(BVmB!J*n8Ak6Z00bg4~i z3}pF0#N~FTuWJ8rzWjXpjJWt@dRj2m?s=gBa@quxyFAqC7TpA8CTGScJvW>_RkY2I z1x-5YKGI{Hu8Q5G`C?2Gf$w*`STiUkJIP5~RWbq{3oamX!^KbfW=Gf#jx+0(&j6u3 zRmN6)^Axmhc1RW;iR}?n5N;3c+K??TLguBenqPBLV=(HQi5`xA=P;|X4Lm~ z0j-ke<6y&DT_o_>G|lPQ#cf`$=w-9h>~YOUO|`Wod}v^PIxQ6XH@MMs^Cz_L4bTSgy2kPqvLuFc_RR8aN?o2@uRSu>~XQI=f!C0 zIUg;BreMyopLp?Qjj5CEm+ba9*vQO$NSwgA>Aim)da>tmhC5f0R78mVinuw@lwY<| z*}0Ab;2$4Ti0N_POSH=*DhFE-jRDy?KB9Kbn;#T4{Mm=v6K=dPvpD}zeD3N&Me)r@ z_@JWUt2$*G)&UWx_oVbf(=xSaX08E4?luqC!cRi|a4H*dwd6`p{kWb3mgco(->e3i zPh7c3`C<@#{{uk#gWBFE3EHrbVcK*iDvwZS*tB%GVDPPa=&N5NX1xA4m_9dzq6D%MQOKG!g{oLo0e=g~6T-~FOd zceOOLi_Y}i;8NBRVTJU7SHHJZ{nCe0Bt<~*A!O@DeH6rq%6hzal7lq7BC0X2 z_qcH6Mh9Zui;|{YMn?!50)FdQS;?4jDG7Xfc?x|T2btvicNw6Y*;rDjza??w)zMI1 z6D*@HGk1=OqRylJx-uu>zBT5W$kFkt1IGf%?0K8 z8lz!WK#Zde?94N$tk`1_Umj64UJlju8-JcJ1Fz~Bi)jpoUmCYhJh-jo=TEqCwvG&zP)(fBVsuLaP-qVPN zMxsn>F2(H|4l0=EvcPsnREwU=(PrK05q_ZSiiP}vQascgV-yhQ>D=DY(@Yzj zW<#~wAfvjjRnm0*qN}hy22wa5r`u;I&GY(gRay7F!un3l>em#W{Xx*={=|c$stEEz z?zh=&BC}1WBfdNrXQPf=29~PadL?%seYLrywb9pGbH9y;139H1h@Ojwt}B+ zhuTf-eRNNKZpblXpUL`#9(1wZd3l$2Jb(XoPuuW480F$qhrr@xNhe9(SgGh?E&t`V z?U&uWhcH^n&37i~v&$KNdmKM0xqJ&TyiRRhxT%r9?Yc=#z1ooQfJ`tF_FPk`<8$+pM4S28w6!vk ztVjUy>J%A*uZTVnUhEpd1wu|PW~kuJCRca{g+Sgmr%UP)K_e>^&G~)#oNM_%o$Cwn zSAg1kL&TBaR>A5Sgh5Xl4aQ{S;m4BcRmvjE`}veqf}>ay_RqB>?(gC#C`0w$K%0O;FJ>G8kxAi)V*bvtk;Uz$47t zAK%TR&HSMygoC)d`0nV{P#g|;eLz5(JxwO55}}TT5;#TL=@pRa_UnsEyrAYBDk$^M4Bg|%gl-}>v?dFy)fC8UU5CnaW?2) ztKQTqSdv?VYI%ie`{}TF1$SpAtDx31lA`ELzNyoIDDmmEGhDi1}=j``*hUgF`xN*y-Wr2zH7wv(zrJpH-0} zgYVe!F`!;W|BojWBIAU*SgAlIBF>JF4`k+;o_Y$ffzQBHgd@P`Y_L}y8X4!y5CeU( zS>>cfK?IQ(NJxLCB2!OSp#90z7YN`MZdt(RboeHU&o9OMYIe+|HYc^!R(4g!a!Exe zRi#6kIpoe1;z)(0A`aWSS3Al_3aR(>zeGC;_eZD}K&myp&ehV9YNK5sRB@3u#Y(sX zEzy>thAk>hi7qrEiUX;<_hUpe&O}K)Jc06xLx${}35Oxw#dv12aVS_wDv^Abe$MyK zZME<7HjnNgNgt>u0TZ(HWR|<5Bw$5ibv`O`-|DW7Ax>Sc-Mwb>etc=0PeedIT(gtY zvFhEsAd8M-Qeggws_q#gI;Y|LK-}LGvz6aw6Na(`NuQ)4`5vLWqmCu~Ow#s*S)duY zT#T}cxFzD14C225j`F5ggy3wa`raY(yFMFxcB;0YnDfh2(RiX z@u`;5s#CKxhBv_<}6;8|^4Q@$=8D%4i!GpR-@CU3VwBOLi+C*B+U;&uw*c zV|Ju)Kx~Usg_+I-4`IIF%xr#M$wN+ij9}@l=Cl>kPuaNaGijgLeuq_!5TI$&FkkAL$F|GNtq8NHuRAuub87|Wbx zlOng3DZIWxF9S#+VzYsfM1=O8C@I!a#zZ196S4)QelUb=C@ zmS$53{vk)4{fbGb8ycu{A3{GZE_PoB%U4p4NbntNjb}MopS+jNl#_Ni9w!M8aQHAj zR(o>Q@3>nkh`+I07cZMx;=BiG$<#$JQi=M*enG0>^m>Up{9CeCvpDqg_sv8mE@pha zBItdt! zKYbzT3#zeWeS+VY8l`2J-E<~^>H`MgOR4)fkXX{OQXZT zfyx`T)d^CGaDi&!HeEI~mZ{R=rz$&L@}UO2P8+3=j=g(O}e| zRRS;a>@R~llaea4z^A8iTAjc7Od}UA$4cR!kq%?l_d^VhjcjSZ185g&l?IJQeg0kV zpqOuN%XNi&P3cEJPtyQ+kBZQ<9+>sD+ylnBfoj1Ig80GVIi;#1Pc!>vuNoPbuH@*mR1=NS}rXq~#XIQh8o$ynEQlaZ6g zFBGp5ps9`k<9X!`q-Yj$r&xfXK*d8KQSL<tB0x2dMgJgc`Qe4zT#*0G zh-($p;Kd!7`L_x3A1;h!eq9V}ENbgyIJi zDj{Aeb~S1#y@0r5L05m7e)5tp#xC_Z;6IeSWU23m4@5ZU!wY?P5-*xM{H)9I6{N%|uH#xQ;Eua`y(H2i_(-uly*&2)A zFe{1OYnCDUA=H!=vF4R@aZ?s#C(V<^93kNJ3h#G_gC#_qM;EuosL&@VE5H}>e&cj! zn3WCb3E4GVKPDRxq4>>sQobBZ(Vo~-#Tnr2(lr}k4b{Y&GcFt}dGyO-X0K$KPjX$t z-DC5fQTj^pfY*U_7NGQ>Tug*vljm|?vbx>6nZZM?<||&xauT*r?Q4ZeFMCymefu@& zyN_T}UoZ~Z7wS(p-OAbasq~qYPD`Fv@Rwy%A@U%C0Ox-itK=ml2q#5<6hr;gwRMBMe;*5tf<0E zGNGi>T4q4cuPI;DO*M&}6KB`SK-=eJgLONdmX(KTIEhG5gzuA0Y1{r{`Qe_&g**3s zN|i!%mftQ*xyNPuJuC9kNPO3#Yg-Buc(!w=-PKUL-RWW)JOtGuu;E!)R^qmcNxj%_ z@Qr*S3}KklYVV4R4GE9aK_TQy^o^nWX;@vycS(k|lv@vn3cWk4IJAUY>jl9>A8>_I z?5DKt)T#S<7N?ysaGpq?qxFc^_O?#_RxN>}aZ1eha|tMk%1v|#fpcNK^x0orZcMLS zJRo@YJ6zEHohKe7L~3j`<(rcd`7~DadCmh4bl^eVc@r8ww$Twg!;-Y^qKk8Yl>>U> zMJ#ROdSo*C31{{lhT3L64QpM?{5w2q7$ZYZ4=Q7_jFRi=U&(|K--0Kt*2jgU89>4i ziL63GkRDg#Ko}~|rLa>JZdo=Q| z*M8)mh?{WGl0>kQR7p>@TSLZ?ZWQ2=xJC~BMQ#6AW%?g}Nh}PNAj{Eia=i0Sii8J# zRIaOU+>%}A+vd2-hJ&kJcF;}bf>6AlUFD3^`kB5)yZP8t0w4$=@4nBduBt1Q<91^J z=bytwUF%6199ctWFRClM;ngq36VccE;g@VX_!J!faz}TXXO{^LPa#NQUEk0cL#t6- zUXp)}2a20M%oFK zJZ>Faw~Ow#BC*%QIM0@+k~XBR#=|D~0%-O3es5Jb~d@Qj`J&JMyL}_JdX98keTeb^`6_^$5>J5T#;;%fM$F^ZkmA=HsQ{r6lR^J z@0mTh-Y7>Z7f2w>uLZQsq?@QdO=I(enqi;`o}3Rnjy#a&q|yXZQe6#yeJBx-JoP@0 z&U)r*B}-w6foSN^J?8~%ddmBXjH~n#>~b+WzLUPW?Nt;fi$E^_3Ncy`3Wh9J5RD64 zf>;DL?OkIxHeR@qA){Wkp8#=mG<2-2YtabTNx>M`Y5sGkYF#@I4@WCcj;TwJs%!ho zwD$GEY*njei|50v>tR{1Gr~P4vAoZ-a(!}7v%^!8md`nq&Ov?3;~Phv$dg?6ppFM% ze3JzZS1C=di&DURr0*#LH#kk;r?wma0^AsS&S0-Dn2-*9)*5g2Wkz1HJiCB6YPiZ5 zrs3tL`_>kGPPeCTqqTb{&OqE6PvG+vXTzw4~y4y2b0f{3`me zn;QmVxs)7+bQ+<)Vqdf_r6&Tbuyx;-^cIaPz^zF+^WUN&)&hCqK(jf-hJXvK106c5 zrK6}H{9kyle(;yLKS$U@>{OJknQN5+7*cA2b?ccNrH7phJS= z(#w_S2d8c17n_mV{odqXxK~wOc%MN(f;~-eYKyN9r2LUCw(ixOhG4I0CpdDzuI3=! zrm|C1R3%YKd_QWR9k+uJ-Dn2C)9cTNTdAK!#y3fvGC4hpAq^J9ANEoD5e8Gab!t<>Z}VC)V{N}H0h5OKm}anrn~r*b8* z?OJDNLl;JA0u%f;vgR&lI=gCq&ESM2Mv9ihXxjXgSeX?xwX}Na@{nZfV>_vJV0KKL zQm@q2qbQZgkkgjyh3nc{Tv7Mi58CKH$15<<-P2sBLjL3*jC6bDG^SbAZIzolrBG^V z1%N|r(j3KPKF>ajH9E7b0!a}zZl)&78?@#r8npHb3$wDa7SD}ozGnaS6$!drg+{y9 z2EAg#k~j|;*;by~9|zgxQfcqqQB^k`J&SF3bq?IV_d{j*@Y9Ej{$NaS@3?k z$x?S2I)}AWbb`awJnshe5*s1DV*`y`HkImAv!3fnWruV~4O~?e$P_M2x%Hu^^Avdi zc|Xim;0lI(KBJR@xke6^4=ZOzF$ydlLit@$chvpvMRVN#o?l{a<^h~pD0||0slt$V z)Pj5B_%`9p2vfk3HCeheE5=Y|{x9lAvRO{jf9C0=wd9b2q5oM8o7X8^lsjs&=JY8z zUFLersyL;i5hX?r_0sA3rsm8jtK|fb+l5-+X?s!cK4>kY`a%B718VfoYtw_L!14n@SDSTTA2DYPiKd6t4wXztg z2`c5bQhyCLy+mw1P}_t&D?zo;=33G)kcb;MgZWEx!$)Dc5K;-l8Pac;;&Yo|Eys^_ea@)c{p4IWsG-KFn<%L*SW!GSM zPukto6ItW0pJ>27Yggku`}3~8@vkdH(IJOeA@EgY#?}LLf(5rkfPeI57JvL>_V*)R2T@`{Dj4MUGyIAcBT~4NeTHUsv|gAy{&q5FPr@oe&uXV(`?C+Vaf)x zQ{wx~02K66W)@DLavyI}rIus?MuCWz&Gpso7w}iziCz}ef$mJ_?SpuD4wKM`XR^}a za=?LspJrB8@kLAtuH6qYBzf>Npt!r?Wl#JkEZb=%d*4jj?1U4f` zSojT)PnIy;H#9SN>wqL4?*~im{W8kBR(ouq49Kn^tpQKMy|Ct!zYEzS4+EKG7qcI z6$c~`uwfWEa1O>F6B{;WoN~RVtz;FceEH;1mt8n2t}#yiDc|iaT9}#f^`T90sNu^Z zhLYPP_rXdHW$A@J)&}DBNd?a=YuUTCqB6W|b(&4^r<;YT+jhDa3}gBC07fN`SxoZS zHtaF_&h^p&6-}@6?}!06S9XFT+f4#z@CiEJAL*LGgyhS7N!rMWrSFdfgpPeZA{VnB zXznSr9E~HE9wefCdYZ-3$mxCF7G+wu&a&#l#8&Me+h#II4O^izF{3^&-|knDkM6Fc z(?Q-`od3{jQ_z+m728j67xNAJD8YEf?i6po@76c{+bZR_@f*aLs)xSEI1Ld#1>8y> z@Tpl$;xvu#u{B3rV4z~2#1H;+#jxv#K0PMIl{8)PflhGN6*)QPI7N?Jh0(8P>)QXThw1N+@jqQhdq6`PC_Eme-MyA# zXRpSz8787V0iv3(n*J}FLM};lNB%eVBxP~M55|JTR#32*m6nZaC7{hh(%u)p5O3OS zeH#s#%64FowK(%lQwB-WDKjQFK}4}up$U7`%@=~GV;2QQn{cSUWK*w3JDb!{%v~dO zGqMpGe^{*cTSTHfFRtxFM4DQj06Q=->8$< zl`IW(tFcSRg?@fMY@$bjlY%Ni+A^XA1x5{vZnd#PM*7eCn7_7elFY*F$Ga zQ^LGsv=fZ&&4;nn({%>Id|VfF)lXe@+EnrCou?8P;_6x4w11iE=XfIxj~oWhO5c|l z4>5qh?QFyeRQ=e+daInpM#Ppit94QOU3%=| zD_OuhqW|gZTfC9&3m^RTq5j9hXv*9B>ET%TuUw&0Ltj)x=Po2`<5lBgiiV~fF0f5? z(n5ni+t?|Nw&kWqX|~5jd2z4%=~l86@n5I zKLb-m?a?tSACPwau}=p$!SaT)sHPDqw&XGeYg0?{ZbwSDCa|1bbR7$Rcmc9(Y%rwb zDeYbjKp)lZw?JWTC8O#~ka;60Y5C6P!tX8)OBP4N)T2XOt5)G<$*EUN+CXb^^R&Fi z)LP53!Sp2I%ym@qVLq=5*7roVUw~<73n#x?yarj3+Esv&d|m<^f{9Oi&{J=g`wXC=w=x2hv)lx% zy$^#1dH4xGNf`aMx%;6&KQTlH%%dz&Yw?KwM1&ZSUja?gdvO~6X~XXm6Wj=k{=-Y; zQf7w?dfc^l*3>ZJ60|c?XpEps&}keMFIZ)U#BIBcq`VrpD>wIkA`7xLIj32VBg<`G zSXkJCbXd3Cmj_&EURriITv|_C!TN$n8+`aR=VAX5fc(>dfZRsoLmLp0FmWx$*z0hP zVWOQc6A^l;M-ZjjznakdN0#_s`4>p1p&(Sh3*5?LJ@XsQND2nn*EDbq%4ess7%Ds& zI7DCQon~oC!~=So70$X?e6!zIwMA02SN5Ap4$rECywhbd*+q|Uzj~%SSaVHpi%K(V zE0#=t+SFmdP)V5bM{ZB*xR_5;%q=0HJt2)t6gjJJtc*Q4p!vuEgjjLuG1HF8k;7C; zQA1u;N%!^&hxrR{c#9UR7WSX(b!&(w4%6612hXD-4wxtysM8~LxF{fmtz%yH`I@a< zSCI=#z!+mB#VoO2dc;SozvFg*4>7ah4N$Ot^5z?U^j_xCyTVUdZ!83|6}YegW`(Tbm0Ui z1PBly!GlZV?u6j(?(XgyTspWkPH+qEPH?y2?(Xh|=665%%lJ#P-4H%}>~o%HUYTD#OWPw#zO%Gpr7RJa7%{!d znQJdY=+BqVTA6pKAApyr3XsfR^n02wHuELU?6wc+7i<&y)YF+_ozOV{PWmXakm1Ef z=kw7@t@I>o!$3DzeW54frE^W(N97{9Du%NiH<2^K+z)b(p$lZAZBBFq(%6pJqcrpN zCEmPgCr+gEd*Y9mc=$&->u9LPi|G6A2Q%AyywZ7OLxs#@FpNuB&dt4rQDTCq%NVN#iOfFGWFI0@2Xt z2M1GAgNDECzle&4sPVYS4f%5-7{R>d#CC9Sv)l3~rltgCw`3a((t@(IGPuDK1L|6W zaH)ogL?;G_Tcfq#sMYWm2`G+41h> zG}f_rkO)irqYV>hwX>u1K)|istfS@tGgp4H8j>YrxAI3!q z6X=_81&zn~b}}^bZ1W+z?uB6gVVNz3l+Mskxyl^ANgB>lLxQqM!G!j&+B!`+>InU z#HQ_)mUQgf6;N(81>V}2|IFi+CNfsn+v8VtSQZMTnt!78?nwmJ%JA}IUoVu-#`8II z{kdOl+ad=~Ln;UJb=*Ie`l0?#c*hTGmNu>EW$9PMh}<4%9hd5@Vx1`evRi%^$VTW^ zu3?~bA)R5fHzPx0?X@6l91^7#NnR@Tb0v!Qf!V@K$VJ?`xw;xhqHhssf0!-@?mbdr zQx>H&7Z#b=DU!Y*|2nqR2$fQeJQzn!4Gl9rJpsfuiS+fksR!o)8sZimI#osO(!nyd zN&}5RRUv2SxUE}{R=<*b2y2%1NFCcOli2*4v)^L3t9S~&`pf~)m_hJw17L}25%iRf zrxtXv-8>bS6}TA3C9O%mVOw>*`}gP58^0?ey|s??=EU+GhY)67oIsV_kA5bibiC7l z%Df0nwq->B3SpaQHrVjoc5Z97cV=V8($zbu&;nAZ$2pc{(r-2j!<#uijBh%}Q3J3gYF=a1HH%8Y;#3J>>{TRQ}FxaFI`j9^9dKy32P%ab#$z-Y`rGca`@nV6{U}g zk$*;snfY)&f8H|ZV9-opGC32Ar}nL)C|fCeMr; zOaETZepe%>Bpw@Cg_^fA-BI6R#K1&lcod^cJcH|0-1M1{ODgX6?|AO8Mi5R}zLT-1 zto5wt^AP@!6|C~wxTA?e%fMiAII}rk!LAH@hkG8cK#c9wYIE@k1)afcLB5mA=}JOE zSu2aJNbxdH7rVxa9Y`a{PI%33RRHJUb4B?a6X-PA3 zpgHy`Y5;DK?{;@U)}*F}$JusP4ZCa>k6p}9OPr3GWD)hQu{lkG*e{&Y*G3f@{p{JUh~@H|ZC#=x!d#IP?M9P^?mi3*)=uTydMDzsCcI$Y;WEE9 zRm5j)J04+NM1yYN`!ad?kb9r*s<7**X@1o5nhvY&q7eJ3$Opig(N4R)jbo42D3{G1 zyQ<|A)7p~|N+H^{#xGLhHMLuVl6(F2ue5Xo*Qfk~hSvB%#SR$k{V6@OqgdAKyN=Il z4vWLi)6?fTJxeUqnzoDe+etrqA8y1JKP2EUisRP^^RebQX4L-pBNgLT6vbPf%m@nY zxqno8{zEAG7wJiO6JmSEp)#?XZuC|RlK`vH9R=pR&mVvXladpKpeOV`GIsys?D<&R z5;Lp}!o^1LYFjI3|9L?bP<=Vv&Kr;F=L}0{>0ax6!C66P?Rlm()GntpP_T^%A{o-q z+(l2Gx`3Z4osV^1xan~AbFX|4l`KIt>DcAV=K%USB&@Bi?X=O22y_K1pV#7i8_B;> z-*Gqz(kQo%b6hlHnz*}bpq`nT!BXH*J%U-BJhIrW51rO1RUx}L+@4!)Yva>NeA(`N zkyGyVt#L8WtZhU%ka()-jt!R{fFu~Nndj@CgEt=@y-U-E$;z$%JWW6SxiE8vE1#`1 z{0CV6|1Por{7rP)KepM$1V)|YyO1L8#Iii!h2{kEyFMb)|JAf0Icw_0tYP8jdOLEJ zJ*TL-&S-!;O%t;t=_Y;(Y~<8Yek@D0~OUjZ5e{5%aBJ>f>HL!okdp zs)GAxq=TIW&VE)fIeD*{S)p#&AGn=}T?d!CIGj|7oUAQ2GBT>dsQ~JP01WHJ8k|c( zz_1DPyfq3+aP4_jP>^c`&zhfKfVR6GEFZm)nrfg61vyLQGMd9VlY#+o=Vk%ckeA1*DYaV&0oNj5HVzoVDFg>y*A zIC?WR#Le(+(b?u7EffcajsM3@^}I$kQ650Ma+&#GN3!oL<}jmboey^Wuf94wU7d0k zrb>Uh!1z!}rpnJx55Qp7G5yy)!R@aw#>tbn^`SM(?o^WuWEn$aTDQJChb&Y%^rmJ^ zyBy|!*!jK@U!@F-KLp17*^Qm=F<;&Cv0>FMcsM=GR~2pjeu!c4RpPl!_Pq*Hsn;Iw z)df63oV zjG1?E|9ku#>v_acck*S+5rDp|9~OgqU=h{8@Ak5NABc~i#tSIv9$mkpc8F< zo4DV>Mq>cX)mIoSA8t}~QM==hh_qV~?0<(2yZ#(dyzQfJ5%0z{y)btd9AU*x>B!zXryq*F<0PS` zv8*9ghF8tnp0=`Z-%YW+@4R-V<6iJ6^*MGdY)lkQmCU$*PSWS`ZA)HYS=8_;MQL5& zRK!RWAYw)AZ$xwR5pu9Gb2l!N7W|qBZEaz+1I!ypW9q6Qzw1d__((#7CN1m&#QB9| zdEDE7iZ`9VpM4}_7~1>j^t2!`5i8P|KtbIoRcd}7Pjk?qv5J?UKU1Y#r_>-lFKTy$ zdh7@Oy$ssaPBRX*@NF*|HP z;^(+k9u!vTkz;c_*mKCz97B{)Rz`%6=z4wkRS2@`!Y3(1EDrqvR7R?UVZvXsw}}!%M$WhSyC_|8G;P%ZT!foo$Y&u9UGN7fCApfcrAzj!Q^0=vwHFS)Bm^U+_ zgL6AVAE;t8lE))Tm7FYFD^Jj=J`d`>`JTT$! zYOeEV!oF4}G$9qiVEc0OlXp0)F5I;*C*~JFevGD5iPvqFYl^ehF9|*JJ+m(J;BdJ} zuxlEK2`v$&mCz^{51UmNw|SrD=;oL0)*tHrCf58Ye-#1RGNAzNK7 zEz0Jbi-x&~f{960tFY7x3t-KIT3>QIX@RvG^6tv_z2iB4*xNN*>xhAMpda1Q@>yBD zy5UxP-)3l!Cr}D(T8Lx-vJki-VvO{m<8mJMjXv|gUX?nsG0yCNWLqvt5Sf1H_;X$AchP|GZBj%ohE8E9z~G^M(3_m{dZy+=x}2 zhZl9EM4h>N4V<}4?HCip3p=-nh^|!KKyeU<6OLv)SVeS=>)beTfQlrR!s!LcLe<&K z*&;hmL5EzLNYUWBJEME){xCJn90OeK{Z2cij*S%Bnq-G48nE9xN{!O0Ctfa_u@qg> zq&W)F(C?P@ZOX?5+hkqJ53yU0YR6s4Z06*!{HAD3-3(3`caJ}v4V8`U=1(SteZXv3 z`t#@8V!f>@aeXULr6N$@)RbajX-T!XpNr8KrKqTgLAyJ*i3kDXJ*^bYwBIkDD0^4; z7|1&_$n>0V4a8lgpL&I;lxc~xuX-`FvauB(mzI`Z1rR<(8-~$d1+%yK&6H_Nu22ys zqn5NPlyoHC0^@j2%50Zl)4cPLS;MxR(g<(MwY!GTga^Sm+a+9eJmLY_gll2aXrN4v2NyGUhyI#!5kcHPmZ-sO(NJ6OM3iW z&!B)$Kcb?FsFac)Qao@DG`xOieQ~iV?D`rp1c~{*$WGhy*K-gj52HiQ6k#QENcXtbs@7M z4*hJUAS(rp>RMvHw4Wl?cy&1a#1&2AXdID@*U}B4M~pZVc@1Zor|*+nz1z|znhXcR z(@pJ`^W8Xbv=I6JA?(e4|Mv46&gMFauy+x)&iOx9E4dcz#&C=F(_MR%Dalm`NvL$6 zA8^gj&g}mxkAxLKS?kq(lk4WO^Ewj zlLpctl9B{1kf5oy<|G@Cn(KL9s@d``VfMt#4eX^zY}T{v*aW~mM!Yw1B<6&8xv z`Ct4t*B~!`JUNE)YGNbAb(6#zkM|)|uI`Q!ECOYwvtAD*R~L``1MNugPkYfqE8q|3 z5A^&Jupp~)*Usy(wpofQ-(njd%+GGoOVGM^Dw70?>v*CLDCMt{Bwoi@uV+3>s=?Kw zu{5%agc)JrZ|YCYS)t?k8r1rkvQKLi_V%84Q=fs+8}5+E(%r-NgHB4|gm7zq_9UcD zpp`rBaGAjL8*S<9K~B6eQ>?9p++C1nAl~0$M)IM+l@`z*Rq%#}V-bDdtwws&Y4R`I z+Z#V&5~6c+^o%{1O0%+5Y>wVeqbu;v;Dear8LiJx#ITU7d-6sC`aY2dwb0nZb!T*V z>@=2j5y;R;cAO2F2GzZ&I>)3%ZI#%sFrg_20|WnK_x}E|XCX0_9<8dc<$WavyLc#% zps(u66sq}Q6L2#$+pM?-o?c#Q1&EOz>uNG9CTyBY=?dih^if_C-Kr@J7>_wUhxfDM zGQOK$I)o7s5k(%>E~yu~Lo|&w9>(ginF+eNvpoj!vBOV3;RtRLoXJ9zuKt_3Lc^1K z3=Z%0D-EdYND(ddOKO!X*RQK|g^kn(#c;dX#jCVar{2Bf9K#{!exf`nkf;t}I+RcUDc2o--wpL+Q{`m3S-8T2+#peJYPoWho z>paE$Z1$7(oPIpR>QA5p_Jww}qMV!nM9Tp&0RjP90G>>HwyK8cNYKW3J#RqBsHlpf zqVVZl&Jwgk4^K~C)9kJ;F0lxw5}CAzL0MPJ8y6iNZ;t1yLq;?CWlK~_vzwZ@dRp@G zf_!e9Uqt~B+Nlefo$`g3w-u=oeEb(=`5%A81&Ll_oW&={rR+9S4nz(<;pb~>TPKfe z)u8=*w0SZ`K-qn8x1K8+geS>@w98+lD-C+1QjjF?4f+CSBs zkf-Zknh{Qas@|(%XSm|#VHbWgdF&k1W26kbb;$uwxyW(Hm>x$mB-I1Q?fmDH_u45z zKI)1OKeD|Yg@PH>%i4rK3K2d^@>l;Ad=%V-%AX2oNQXN+CUGM+>wd@_cg~aF=w>-k zNf|o*@?JU~PEP0ssrvJ>vVKS3R5%28bk9-ZFZzB@EHB>t-O9_18*4RS{qR^FxxIlGB*+H)^ zz`{Km8SFb89y%zRIzQ+f=H{lCvc=Y&;*o@O&Pgc!?tKz!$&*sFkD7Z|ztfkOIckQ( z4(4&|c}?txPf5`KVYPe%l`PgVuOth3I#e}3rD%_J5`61%iVAf4l<=MVp#NTTlB9XL zd5d#;ln)3P;>yg48ERfm`D8}(n*#614T@6R&dtd(Qf>Ulr^{P2RJ`t%nFf`#)E58{ zY2)+-AKd+fUHjBWfA=!sJBB_h;ml@3Lz^F=`^sWGt9oelc?XMFuN;)~#5z>uySg4! z)mziL5nN(GU9P%*FuN?Ud93}HOFA@GQ04who~rOad?jl#q^F;ruJg1@(#W`jWo>&N zX_{j_7x?My+L9sjbQtAa2~Sdu78wQb;=IDHUW6n8i_uShamHEolL;|X;y&O2J5<~t!EAwhM>C=7fY6pD## zC7?$wUcFzMnL`e$kaL^RVA|adoQqv5aY#8F(2e zmzOMzq~ml@yk#RWw7>xd329d%EsWgYXG#waLv)T&|%jf!>Wx&5)0it^) z4_1xYh4GP}2XT4sfSg^N<;BGrx3{*&Bk{S-2V%*|&^=F!bh0JN<7h9Yus7Cvu{ReMWYkoP+}vF1Q}*=uoDT7ZLRJ0i!}&Y; z#6-_gp=~ycbrEpz@aBMc8FbQ=QkCOY z|BXAuf0w!A={fU8{o;O1Nr%~40mn_JuU&lA?Vg4b^7z}dzE#NA-JHAK6O;!~4UWo* z&*G!jrF`l+R>5io)|ZP(WzJ3IAGnEKnw|C)$bvne?(7c^4|9-l*$T%dcf%XbhUnX+ zOh?n?4I0>2+(?$4{zyBWt$p>l7@$aKC>t@!p#dKBvgQ-6lQJvdT+?w^Rcb(q3x%a|0ebS|KjrivYwRpEf7fjOcy@8bt1AyhCQg zF_c#=24zKgoqTy1hUe#``Odt&SZ?}A`oYD>C`~4VrzF48YDn*`a1Sg`(s#e`-jS{0 z5ko(18uej3o-yKP9=td1-Z~DRT0B2H0#l#@EOx6(ZXb9Eob&{3a~S7n=*p!mCbY~` za}j@|Vi#|{{A$_r)Z@j9nsk;I0+fT+uZO$G ze!c4PM%@=ap~xvUrD370{SYf<>$gGF>yU4EZHCwn&3BjTA5NLKtct<8YD(_*-h#Qa z*I{+gKmvW*dlTm4=Pgyrgzop3fGnXl^HI|ozp$1}-f>BlJlx6Z+UePu+r6*XkeNwz zAE-J?GL*b1r)#`G=ek^Nj|Au7%RVP0^10b|W}J8Dp_%JV=`lLK-Z38doEvjpl=|jO zIF^EEsP{{R*Ot0Fu{18E1vpd<{Qy$=-CHeg6PJy9D~D4;xBt+){c{i}O9%*p zy%e*-)G7h5VnSj(aR?ITMLt8Ln0T;Y0~ zpRuOXKc)VR-9X17z}NrU=fjjL4WhGD*miVuP23d`r=W2C4nBexQ9g*6>|67z3rG{>C;;6p$jrnQseGe&%E9bKhU2r^(Elj zJz0jKnibmTc)adH(Lea??3buBL` zi6rj%?%jp?Ulvv^-0f_>de_X#Neb~Le6MVZ_I)C~ZhoD!>n-J~Fp=YC@AaUoKD~H1 zZHxesB7)c|iT77aOPX6&?!ufL?R0v06g)ZmVM{dzO(DJQr}5LJGw=%BVw{f}_v01| zOESpF#VGDK^{L|sR&PR;W6zaER$>)zL!{kJNj&4_=^fKR)eO6&E^(&uN_Y0gtgbIF z?<-IHuH#(=`V1!H^5yQ>A52xP-+0`6v+Xae;9z!|b**z@@_onf@NgwU?~5(*9*rGr zZKs%n5TOpYzDS@(zB|lLOPJtaFDn0vI{zJ`exyX-8Si5CDE9XK-}}3dT_9hfde%>N z2zfzmU0q?<{cjKg6O8^^wf#2bRH~?5F`{S?jKwhuljB)=DzqV)v)XaIcKwfFO%&1X z?7rjdYSBnVb^BD4nn@{Wh)w_v@^d^^v; zQctEf)2_K7IhH{pkD(5B#Q6m!Av6hb61S+YdZMPpu{x5j?(|}{x?8>L!mAzj3>J$5 zCu++2)+YDFK&SJ&-42$4w(gXs>9wVWM(iwBS_8gL18fu2_v`I;CGEONsf||2o|crJ zS+mLhcfq5WFB*AN1U@cX|8VW~Ge8l$)ISB>%Afb(?rpWd#>1fyNFqTIFKKummJ|V+ zz5d}_sQt9uQsT~;UlcOec6|qF8iAvaTvt*j^ZBgw6Z$^6w%$F+ljF6lOvj zPQs{iP+0ae0kxfdeWNR75%y4JGB3&(jN-lBJoQr0ZdMZKKzDnF$*%KFa`o1Q>C&5j zasv&33>~Bfg@;8TxQa5fGkU`<1E>0|HosS1>ZGXj$Tj#N#QkpyvKK;A5qHk1yBT)*5nA?`(1E{m93%R)xpU-jZ;t<&JN;GqBDA1y zP&g1u)#vDI)yJ(K3yX;%_N7Y^rVH=M7~5wW{>g~jv-wN*dc7_Sjh@+SAd>5z`Je%F zmf}Gx6XpcH5e0Mo2s-l>OZw^t)<&Yqm;_a8<>{ne4w)b0{B@<#jc%jO;e0Mc(eW{E zEI5vKgU6v&1^CgU!JOed^6w*J-LBF+2({X;3ze}dZERmBRH9* zVNs!WN3iR1eZ+M~AZi=q;{Fl^14ZIQn! zrfVC=Qn9JDg-D~!tM4_lp-SRi2cyZ8mjH(A6;i!P<#+4Ia8XNJTUCPuK*NT!cdB}B znnRKUlF}4_4hYyX&{s!Oze3XRNO)r?D_b6Ji~H$QZnf!X<=x4L>#M5@O6$+ZE48Vc zi$Z#{gky;ih$uy5=1VHLno8C(4+9>wiTb^(h_CjhQCN>V0}roXqe!_9Xm-S zRosA4{$`(SY-B7$0Z9kPtnVgW;ynl0(DKKVPE4p?nO39!=eenu5Bb21 zLWHTgQ|5HNIbQ7Bn6fUGjqx!6#5UQ0v>(cxW#h3mJq60OzoG|TP@VvZ@9BzYG|dw2<=(A!H(OLAy6>nMNgqoG1x9**X# zE%=6?a?W9!*_{)0b zi*Pd!4&f09J?mhNJ+HhRJEFj)$P0|C{kusI5W#3rGSxvRnyty<>bV~gVPeC+hY33# zs)?Q5?Ty!H21w4teUVt#Vs!90btyJ$i+jJaZl0=!ApP?q%{cC^`r>ZJnw}`( zXSY{zob@-yQsN>gTV*U9>O8KYHr}tAduMImY8?B@q|ALL>lLAN`$YPtN&TBW$UajN zarb>4J+dO}J?yWGbN!hLcl-_5pF=Np;-;;Ls|N&3P!=E^-X!oZICme{zhJmsjH!<# zLO29eVPP%-V#;E^WageDNw+S{&6eeD*Juk=u`Q)xWg%i~3IR5^Nos(WdnJki>W00}Qnm$9#B6lx&h&7IIqM8-5aoMf(_Y zsfo)$ro?#e+;-gU9n=Q>X)~`??(yy6KmLvWh#z%b&<3WO4N;L`pX$-=5k}+QWddHg zzs%B3MEL;aTWPf3`MYb`i5S~g-1NuoQ*2|^FjUFaOO;}uWn_!-9ASHdVujCZ&F3qN zMWH?PH`Nsrd-F3rP88WqJ+}*sx{?6xB@9;G9Pl+KrnHAPFr`}ngX^Dd{%1NMas=Y^(C*VSOFeMgoT_zMdbjs% zL<4@lt?Q`ktNQUcsJ7Qr{tFD>ak_$)dHXq>tz35B)B#XY6?$T@gE6~FYM;+J5q5i_ zt>W2`pZG+dwd>`8h$cW(#U}&o;z3@Ziw|R@V^xX1d)h|j)TrtaW0=pU$64=j)DfWn z+Ekqp))uIoZTJvn)JIaoyX~Jal-R0kY*g>@PuKslw6Q^4toL;;03MYJO^a&iRT-aHX>od9`2PN0 z;+MQixY_0aMuCz$S_?*8N2`jbp&QH(sv1yS{PRhD=ahS$W_Xq(a;xQxK=)Va~07#~ZaxlQ>an zNTK98I4GfKHuY5pph5z)Zk??%(PF*hF`JYx6f zDh-PXKXMyj|9eR#E5cflkHt|zXzMSBoyk@jwsBO{6H<26sc_(U{~tl;|G1bh!BiCp zIZCRh{T5jXXmA7&#-;1fj9y73f_U zA%zN#$+y4d;1mMI{^3B94@X9OHxg)M9Mh!`kj`Zm&v$kkH7>ex_5B^zSYVy01uicE zJ@OTD5taP=Ehnb)H}L3twk9zO)$@h^R?*3_g)a2Z?G(v zIE3&#mcP5Jj<&yIv@C^qy3rl+@Gt~`gN&DX&W>PE(}-}YPfXiJ18Dj^DF7jSPXM`E z1F{Lh_-~_iwsX^f--S=HYZjlE^u4UK!my(*1>R4V`DN&=P(Z)1Irz{bxa-+{M>*ma zsP{h3adN02IcfgEyT-NS6C(1-#)-?U{||NyJ@NaNyo#`QZmS@b*u*eGzpz`jdD^<9 zK*yepS)(uCJ_4ZtzeX~RJPneiXR(B*9RNuh({{6(tjRxo2+2|cfv-jftFEE2PQD_% z^v6<&c!0&Y*z@wRa3?WU3`UEYF|1)JJZed{2iw*tD}->OKlu`|OAe3|m3nP?1A;|q zwe)qRzYzo4H<__59kfl8>xG!ao6YdV@HP=D8&_fy}b_Ayrl3 zcT+;msiLl=nJ$SSH_hwK+v{asLR_>R@dPD+U{v-*@j73eYQL2$Zb(<~3FnB{Vpnc^ z;A&fWr22atZP1}$QvC!nTh~sz>(6S1)pLbo2w~7A1j+)8ad>A%c72~kEgpd|8h`i) z=^N5#f&FPn(IW*Kg4C?ieac~>-ZM3@pP2rYQGXd3-dLrwuzkd}@On%g=njyjHvuTU zm#b~}Z-2N?e*Oj2DcW8Q0a3Z41%uwRW%zJ58Glrw_gOlacnYtqprQOdM9JU+0B4}2 zFHURE#f)cl2vDmLtEo0N$yBZKXIA+DFqJ#g{cBkMpev)o#fJ(k%yHnd(eb#$_ZKd? z*7~-S5hJgi7Vo3c?OyV-qa3fT%UdqpDx4bOa@caMPXagy9nd>!6&+3>Qs?i+Oqq>k zbN){|^nbjS9zbg3Cq%25!4k|Q6rfoG%|jh?{pk`jrh&ShGAE+PtXe$KM!4c8R+28i zdKWNx4#mb2qswcDO~fXVXD-suP~ITpfl1EgfmZJ6X<piRudqz?GSb7NBp`TylvIVn?MuJi_lSHC`4!&&#yy z70ez2$tII3+^>8osi`GG-p_pYUa395tU|?%0ZTCsj*67fovM&uYHF$(P%sV44z$nf z_6fF9EU~G_F=TB3+IUg3w=HuN|Uh6>HV1z`l!0iX5XFAO~scYfM*R5Ub zLN)F4uMbT7o5G*87A__w>5F`hS~{WQv3BwJx}A_@XdR)oD}|e+tj1^7XmT+&nr)5Bz*ucT zP4oD1YsL!qMOK3l%>sAkfAFj1(!Uit&pmC+%Wn~E^1S!(cp9f8c;a~YUHs=0TFSrm zjlF>q|JpGs=y|GD8#ahPntKK>^Id=v3g|#eYNAyk;ISh^&RimF;L6?(i}}LU|J9F% z%{EuOoIATJIewmnQH&LjVG3R3yBq`L_nURCdA7mdvYh&GnsAE}J!9^0G!bAq6LCJ? zs|49el3Q;jSmk^J%{4~{^k_Fhc2olp#)OaqSF&DtRW-g+l4b|A;P7(!EbGi* zGNC(sI!jdFa#!aO)WMb??T#e&_I9P2&6t-u-JHqVoAE=5M1^Gc^PsiiFApxbNV_OM zP_)-vNolmyK{t5fe)}!*Ugpw}X{_#EShVT|kqr78UZTS(gNoX;%a{c|iMmFJE z0{Ua&AmpIG>on0O;#Rr(SKRiSPsjwEUkeCcIh}diX>I&*Dm&@`UFmYFj-)cXu5578 z+d6|v?6E3xf)=Ur61N;{o8JMkfb(W!h>gk*6|D>R^v6*XvlbkA8x}nPvlhEe(>xg@ zeknuis>K}hB6cI*@MO9^nfq4ovguoRyWQ&LUeL#Cbd&)m(%Y7vmFtn7B~L%IvpW=W zQzS>5;k)jpFMJHb|E<39G7m77$gZmg*ntvfj0N@MVol**5Usl8T;Fj?EfMa*!SYsr zp-{TyxSaf0x)%t&;v!+@U#AL|YqJvl}j53IWJ)wzDbk?9(g zmO_hpCvIM^T*WkIm#%HOfs}dW`yM{r*TSuF+`Uw^5QdERvspaKk=#O zTAXDHi;iSgg@(|betN}+8UJ}Sst|yBkg&tQp)`_%T6dU=o1bfqMpK`Cgz<|1^cdx@ zsvbbe!;=JrMD6Qs3t~tlJ!5LpEkzqxO5D4vwgfu9C@b_V!6m=Q>Yu)!toF*}5}tUwBKegp(;X zn9~kC3v&R-G3ZK41Z!ZNWc|gAO_+C7lGh5xBd@+yV6h4`#?S(C`l*_7${wk9IG!%- zpZN{Gj&N4y2@5r242A$b_wk%}=wUd-$eWLQ^Go7?z1QpcKwWT`>J~}|5@7q3i~I_@ zWXmEyqBIC6ZZg@t<-mW^s%&r148nBm@7}0|`-X+or=d>7F4@BwCh)7f$ZR8G0}{#< zu4brd$&JM95s#1)VlBY|p2~VTcWVQg76~!Yo6+uKJTi&@2*2Yi5^{1kKWG)hXgA$< zXe^8tb{bN%bL@*u2U_Eit}DxlP4bNspO7xngdrPC=PiJ75SC-7 z8Ip1b1#@?v4jrx3hrq$X7ZwzVYUB!e$Y$_}7mTH4T~skGRGZQtueyF8RR2()pRWCo?|a@;>U6YcU&X|He`E|t989x9Q#MJSqZ_ZbK+~Dp>~f;A7`QIYu3Zk}BaMek z4?1=c8bF}Py`muMYbGuDQ#8uS>1&)mEKI2hqqAKd+Gyd9olSfXbt%z~c_-m~=2A)F zU*%9X$hJ=}MA}?Y5gqd9I3i6x<&QR3_+iDAQ@xKy>1Nx!WwppPrts z@p*nQKb&NnCfK393=W1f)*S?RW1-r`-%wk)>^8XoI4=w7f~aMb=-!WS_C$Vx<@BYl-9ALROPvi} z#)8Z6zxX!)RWCgm(h($!&}iNMa$Rnkp_VVJ$y`VF=)twuCwdcYyAsm#84Qp7U&QGD zWLN*s2R~slz0I|PM-^?M>Crj3&eFodpM!&g!q!OCvbIpr1lZnNXG7IE?j!StMh{)S zqZ-&FA;A$41z~9_>>k-^zo%f@#wm-D97iK^LNK3<(1a`pM~A1h{&mg#yA#JjP9n~@ zSUlz3)-DjvQU31BrWycN-X$Uuq)TdB#)o6T&$>M1e4NLx2PtYdl&U zs_fCtZo%)x&;8I!XF+J}@(og|jx+3b+x|O;`zy4jr1Ht)Niru7gOj)4Af~$&99H}x z!NIQp)zruyPnSbBPj;!CUSZuV3U6*XcJ$`743e4kC*9QWV%@uBR&HI$wwn!b`Y0Wx zJ*s_}wkJCNb^ptmr$5*$qt@o2T7$h-yBdv}@U%dVtwqs=6Gqh+_#FS zC(kTyXN5Mz2EUz0Zq)-b-p!QfcOsV*eWySh6;4U*$hD1qP&capbaq9T^Q9~ki|npD z40WH}-c)T!vQt%Rp#_D9s2O~+=}znExkck$bWt3eNw=WO#7G7L1(cj7xQe~5YrS~N zQ&^)ViJwDj%VL;!pWmxTH~8MZy*Lx_@Ss2gQ5mTae~@z;5UEPQ+Si6X@)KA>2>q@x z6y+=I-F#DNXK*+6X2+p_Yt8SZ;gr_!%USFY{mywF(;=TMjCS5>;$ckXjSPUzACkQA6z^xM?!h^zCZk@Vck|f;-1P+5gVndCANc)4e zN_615?NSX1fUJ;T-?dbQqb-(pU z5=<(Xm#3;Fn5Sy3Uw5cx#eMIK0h~_nxxF&7i5&`080(L-3EKD_P~VTlao0(Y_G(Z! zKQK{mizh1buD3Bw-x58+`wf#2b!L^Vyd}$~F=*oX374FPl2J8nwBxsKh{nwSG;;c9 zKJ!(Dz2e$+SpoplMA%YyVKm5PEQ zq*xtBwcAg&K21MM9I4M`-fVx;1P2$_biH2%bCb*`G}K1a6P{MRDzK@!SsipsR%}}c z0Pu9{)&>1t#7&cIXrq|x1Ar&a!oo(uJ*X(uF5Ijf#Qzr^OPb5C!^YbA11MJ-r0R6V zl3e|dumc!*777 z_KoUGxfEJO;&BKHem3FDSqN!%<)p6E88^n{t$B8X-)g#nWOYF)n^tq-`XA-w9x_xDxM%uSG$Z zjMz!4qt1;Lh?sx4XfloB4vCXPr2P6W;_b=?L5JVwGb>rrM^3Y<=w9xGS~L@GG?R*E zbRl1r9BSWNkcb*zQk$3X4Umd#5N^$V)4rR_fXyDROhp{RwEx9P)$pOB z>gP7Migk8V+Edc;Hx71_K!y)+ej!mOxi+)iPNO_gsdZ0%kb%BSwLcHII-)3=Ca)Ru zwnGJfurfGyDvX^1AGDc?qtF?gwhw4oHX^k292E62lYhMUWjS(kR16qIIJ@R)xubRQ z9O7q(iPQ6*2c1sR`#ucCTSDW(`Sp+zy&V~XfbvetPLh@iOUm=KJ#Q7<4UtQ|?_>^K z$F3Y1KW7x!Wszhy4RboSF)Et6%Ej0R@+|QOrV6p#rc_PWgj-Wca&fQ;jyY#0Z;!66 zVDInUZ&uF;Kdi58(-f`XHku{(s0)#C1~{rvtll{yZCDsIW(nJx2HF+WiGE4LwITuP zN`77vjr9U|ZNHD@(@xk!R@h6k$kZXU1K7LGBELD_W@h(%#~Wv$sP97ud2;sS8IxV)Yj!R|l^BnHnp(Ci*% z^waWm?$cObf4ntC=Fqp94XBKF;xIbXUKWjd%MzoTgm{$07IA#3cAvQ%v=CtnY;U z%A)I-H#THmT(G1pNom`o04U(&@oJUDN#b#j9t{w8EqwZUkJn-_SnSRy!BvFYp1D{K zm2*WQ<@&;6T9Td9ozRS$#v6x9;3eF1(pwSYyY#%SH}x9YVQHHWq&_v<1d5}!_bA8i zVL^LQ8KD}v>iE81(v;cbWDskU$|Xsv)UiV+>4tKtSzfRUaBv6->WxvnWN>AAGsY5M z?pQaS%2>4A-nd`t{l&Q~{^DE~C-qJ@I6!1hy({p<@L3}429Let{Lf92s0ShNnn~g3 z8@2FS)DsyD1Vs)=6auYM=kBEgUT}!8uIAo*r0&G?$Ed@ZG7^Yq?0a>e^}%TP@%RY4 zK*xgRO;|Mlk6$G?SB6ch(QB^2TQ~`NWs*Wv!tZSk@VU_JqE}nmR*_Z~Oj|Q*D&Z5N7qfC$V3wNp~1^~`Hb zHilY9@|*3gVl|H7t-DOGEk4?UXo=XENznLrj!1f=mOBufYBYE{9%r?70*P|Fy2JiN zD^W+`=>87gyM8o3iIs#>KN?HU4$qjK27Vsdw|vh%4)|!a^!Q=eSZOKOHmBUvP|0FR zE6rup0HXEU;}bGxB#m71)8pgKF>xi)tMYjHhD_v>gEf<5m2vtd6yD38Ou5iZdEZ=> zeRR+;dUM&o`8j#M>=Rxvl@2KfB-x~H*!%Odwa{|=aDz&ZDw}YTNHVv5JUWKI9f*g0YOoP(cn4Nxfyx25|?`&$Ts(hI8Aa(x(<qHZ z*|5xA_JeMz0_utYJlW0s$X9PWkH}({Z#r*arSX_csW(K{xy!J4Q;l};W3pwnAp^KT z@(*8A$>q}il=UTl{_w@HjSTVyNSDLICX0W|ll=jCNc-S>#Z~wH*SO_)9RIt7lnobc zD^)FxwarBx{nLfFxq_Hv&U-r?E0zKVvK!m$JYp=e5yGM0wy>j;FDcl3{D16Qv+}A| za9>G~7Y7f2Phtt{0SjxH!f*bjm`Z>kU{d;XztQz;KzGw=pJWVAw zPEBWvoZ$WeK@JfQfN|uxK7DwBg(np+r4!5LBFE<tD|n3KCJvJQ8FNr^ zSLvj5$18GGSB#84qId3bz7dB`O`^eArqLei2s0V@$Bl^7Efs$Kea%vzS4tr^M|dRe zZqFTDZj>9Z!h|^Ic9fGO9*^8yJ)7@7V;cfI7gicsu;DmIZO$2dZy41rW=sS@b+tQM z7YbR5p<4N6l+df3<@&DTI}1?b4b`VTcB%f^hcXb+xCNiNe(PSzR;J5X{ehY{SSj~W zu)lX1@w+$C5*hklF%`)(Iu83gIT}$UZ0+p<=n@0V897a=OgdH3W!W7zAL$dmS!& zwE!d5_RwG&dV2by;o+>WcKq;7XTrwl?S9Tjc^VX(Wl&-|D`BDTJ+w=ZlZVGe`KZ+_ zfBI6yJ}S$#Qvb>2zB)mSrVd1LSFy zWta4e1X?PUHJ=?cKXaI{hL^lK^_Sgj&oHCp%x4rH{`9kqfuB^ZE}697#5}Z{vEw8$ zX)Auwj%pF$gaFEY8~;JZvtG^QyQ||Q`=cIcdqh(8#E{=GtU=XGRR)&D@G;VD|mHkHVaE%V2FeF52Y+572%QsPWw6^AM_ubCW)@>B2lDs4y2U-{s{o`~0 z9v%9((4-+6x<8L#ozaq{y44CA3{~dpkNvX5c6<1GTZbCXQErZIj;SulJ7wfaZQejEX+tcD>XZ(&m zE8E!)IO{9&4xiV$AEzNQNhy)KQ!lrjq=(8`Rrip*77-0MYa7q!| zVHGr1(ffkbsV^ukq|AuZ=$M}Ej_L}V7N<60blmJ)%{y4yF6TM)GLl`YT)kiJb;!hY7`HD;) zCS!E&klfd__UKYIAy{0Cu(X%^O;1q+fo;*y{93+jWa8zpUE{887I<}?hp#J(399JnR^TTe$w}~{MIV=0;%BP(uOD=;JRmz{`1^dsMqdnD;d)v+<3Au@p4d9ImOs4zU*;yr2%yLD5`hM`e18Zy zN}5njRT|$X4>$hV`=gS&;+D+UKYn1IIH$We6Ke#3-apwgL$XVYi{8TqrGz?1sfV|O zQPv9N_JK%wC(pZXm~1r9KgnHar&M<7zvUduUA42J1{Zn6dd-X}GGn=$51_WJBL&{$ zb-H(=R{vt(wU&dlH_^BRz#d{-7Z=Z_BgL4sVZ7JdR)50CQsnbMDvKKLgUcyKG&}Ik zN-vb4K}@+fi!r3!VT8KWbYkti!NaCW!lC7Ux^Vd;^`I8HBTa(fWkn1(!JD=&dCgLl z4M!$5BJtEKU>g-jN|*`h-&#BMI)tCUw?mxBgJ#Qp$YNPJO90+`Y(?_ zx*4Clp7J$JkX(BJ=e~6o7T_{d?*IK({d+^q|MfvJT_PV_knZ;I8D#~mJbYWH9@1_1 zXvpq5z67-!>c2|->`j>q&2HG#(bSIjpfq>-bVa!4#6_XY$VBZ%0PMx+T_fE$uh8x> zpf)&{O;S$s5Kme}*g6nnf0PHwyg~1X5K3i!>DN^a*()3|@i0JYP)5N{Zba2y(uZU? zWN;72oL?F|?um1_J`x^)zM@FvM8`&Lcl0k$ta^rElY&~CHj!sq@2nqUM5i^f7>IQO z&Qxp&NrqO&tNSXKei*5^ZO+`t-VJ$c91pZ@@QYp43&^mUd+=HSnBVU zA0Vby4+~fi_$;NpJqgO^dp>IRjtQ2F^J?1Fite#JBi4!qVM8-}NUx7NFS4WU=6p~U zsK%!~$o2C61MMvIko)%?^vBLaHWvHasACKj{A>67yu>+LnjE&fESkr~q5$fU%?SC3 zK29nxlK6yJcaZ(mxWFXqLa6i~Xc!N~ZhO*<7rWt99IZAE z9DD-d@pZ74%;f&fSAKm$ZB=xP6%JTTSA7Qv28+3XZ)xy$m*2F0J?;rl`t{eu{(vme z7v~kqPFGlmo&qktOwVd_S#1~n(UE<_}GrC(j+V&FxGTq=eV_cKS}$O z=&}2?3aJ)oy4x0NKGm9QwVaHyU#RZc_is4EgXQLy%gKQ;G(U;~twW&vPR@#!K)79j z&|!OesfBe-?V^$ht=2pqS$rNdfI2skYe(an%ltsfSV)ABNhDJha>v7BIA|oo`wFjn zuC7XKq>^f2Bsy32HG*U3vM5yrTo6B0gpkd{o4VIhMY;@4rbtR~D4pHzzM>qN_T9>- zIphNjQ}+CPW6)Ai#x<7u3O#h+=VNTWzGKj z)Bh$WzxYU_D$#7=r2HDP)UD8xC3gutanco|D8wjEXvvFF;l|<^c-vL6SwiU9^Olg7 zJjCBB@(q@v%Bt=|aQS(LlHs$&B(F+SQ#GWjIhLrBcOvlGk|I-+6vvzwKQYkZQC9Iy zOh&Lgw`&A)Xrct>c zt>-GOMk+Wk_YsAmo`Qi_)X@Qk6?Pv0A>?Wa6N|BkE4FMfoG%K}9^I3$7;JDZ?=~Vx z^DXsz>QcGHuy126W~I#xQ=jOCZ>AT3Bc{9n6ctFr&!Ts{6Rtp0C0)qg|&IlDpVLY z^*LQ%U}-Cfu-uaagIB1D%<19OZpVZ`MGw*UW;Qkl+9C>sx5_6;=g2Fn>il;lF_3FR1$~+7$yZst9K6-56J@ zzAhUggo=$CE_=$9WM@X(AA6*d-+E%PCunfozFLnh(y^I#g+AOfTPt&1t9zOcp{J{r zcj$PqR@Nbf26azEFDFJ!uCDbmyfh*h=$kRy3_kf0YQ-Hg3fY_Rv5|Qcb!cy@dMOtw z;&gvpqCi8e!#WqZ(H)Td(uyAn@rPb1cE6j~x+n~4sQ#|nWh=x~;;KH$5!%lIm60(C z@)yz7{nir&w;E$ezPL1765hE^`SNAA#v#FN4HSfnfsTf7oz|swfBxv3p`^@Lk?W6} z-bY)i4m%11#5&Mqm<(4~)J%p54YBP#xtHX9)ZArdi1$(IF-Q|XAh)&9dQV;Mk7;qI zOUs{IU2pqc9bGqZdZ}EhGTDmExRto5lvP-OB2h^?>FkZ-r2~M;#+6` zyK?#~x^!vGwltiU{uo-x+vKR=-45qEIxBe}opJsa3FEx>+Y-mnDk`m05|FqJ%5MW$ zG>qtQABSfO(FjuMlwq201lvNi8!VQex&Nr6yA2aql~V>bVopFaN*}gyJ-1>m!bc+g zf2=?$XiwBHr0htaNjxVE?g$RORHnW@7wtTYSYcelf3`fI-75+3T9d_CJbM=?cU0Tu)tw@Niu#{&tq;nGPNUhlLc@0<1sPdLhacO zlsJ)$Vb(Fh=35~@k%og}%p6p#qq`*P+O_$<;G%=~6*-Q-FKeRj5xpVy=2V@06Di18 zZ$_EZXz!Dd!)Ddw)trmmZUvSxAF0mE9v|+bk{sX?$-K*<{N(!&+tteHFYhMc)r<31 zPvO~;lq#;cC{*)Qsl8hp_UN=BOlqg?6@4+tP4z%Dl=t~=d-CC8(2c0KgR;kC6xk*L+1z- z=egUJ-CaMj5YgB=rS^3KJi8xc(4KyC9%?^dlFbml8{E89@eVui2UMS2^U5g%v8cWi zE3`k)@3sqLUW6?uwU3oC8@sMn6S^kgbSYpin)=!w8L@Qol6=a$b1`K4@opA%Hr`Or z$E_>@UU+22`Ur7od>&LSkC!VPOsd$;i1}i|b8LHasz&enc&DDWr$?d7IfU&V8aKL$ z*OAxgm{C@)O19CK1;58!?cw2Jdy(g|OQwruq6D$s;8w6o|0|KF7c49cajR-JZRg-I zPjkE>SxdKshwj;junohhMIYS*AX!0H{k1C-W-XI7ZtqrT>+*9O%jGdN`}m&6NeR|3 z+7h7<)3xt&#V7R6+w&Y&(MVg0-x*O4o)(IooxhSKpY4Qu)9&?`q#YIrZiyb(LeKU^ zC#D+)SE9zjyra{cRJRJ-Um?RkkIBn6)fg-dEH7oQU z%<0~-ldPi<2}^>yXbld@H!_#pZ$jCuQD%AGP>t0z@yrENUr^b_I+QRzuVK|ts?KDc zJapYWOHq+VD%}xShnD|O-mrWpYyUD-fr!E z2;wIrNU+fAmQy?u8PQ#i33E+edKZ6*EG;Y*&kDY>K5`vGW*mM_icm9v+sjR6`ON4$ z)d6-o)<%C6*8kAqtX8Q9U2{(@3<(Ukl?>CZwYyXdyIWX`6!RiK(*Ki0fBmZ16Qh&2 zkiGMLYoSxu9%}CjXYe{)ji$ZSF0!84`$?PV9=R;(95p2h_lc;IRiJD)?)bpFd0WQ3~cxZ(UI*f01O+3Tykv zEP$1hv*cbv5)K3NBlj2g-%sD`5$@0HG#Gok#YMInw;n6H@{(g1V|aWoTKu@GeJCRe{xrBx_h2wm;Vw8`|M7b3O%0|9ETVxNS`R~&se`bUDHzIk>`1_bEA`V+3MXPqwO!P`apXb z{o;5tY(=T|`2x$v#)h%0l?1i-{4>N(16Ztj{0-Lws)UlBH&CmmtTDsu7C2p-J0}q< zYD+ksz40MLiOV8Y)JI7_*OP7(T$n>GM;yRc18OJyQ(Q?h{<#|~Xa-}oeh!=junn+D zMFnhqBfdwns6Q!f#k7z&xp~}axcd^Y9KbV3;&i(*My*1^iLsr_gRQ9s-JDyKi+~HC9t6y2umLI73cR-JpDHt}f7-p|fq-FRZ{F0s?m zk1yGzO^1q3`jG+A_-dA&>gyCVVXcNCd+Jy#s-|RBnRVh`rvX}>_lxQ!(fgp`)9FfG z4oa7RRw*)32FK$uwL55*=u~+VONSlY+&sE)uL2?PCOM9#R%b%}ZlL`W7<#7stgyF{ zM&0QheewkH4?RO*YnY|IZxgD&iC3c#CX^bU zU%f$MzrAzglq9S$Bjh<(dO3e`t+W>zm@zl(r&{8a{&Bcm*0ut7i=80XKve1SnxE%! z^xpIa5kiD^?jR;(qb*c!rthmP7j?4N9|^rL>ozs_km?gdlvBTVNPc;V@>-48f*0&S zJX3u!RNYNyB2|L1kw&8D*5V8DFJH)VTAtj-Y=%oXABFVYuFkhgGqb#w*po=;Q!tJr zM`V63McWERuh?l|9#Tyf%Lf=-x=ru3coCs$QoV4ccCA_3hr@^+6YlqD;K0v^KMSn# za9;Aj3k6~*a}w61Gx3)(HkOBE;R;7qpj|9jhkp*PI&g7b-KMgJQrD!LBqCOu0E3{~ zv$O~_@g)^;wC=7o=g7V}rr;o7eQpC=^j);alN@D2JEUy$iTD)M3FrKQJHWpWMg!~iD|8HNhfg#<(#4*=$ z+OJhGdDM}efi5)B))n_9sRDa%3u!wq!gT*6OP4^9JZ23+}`WBdu9`{V_Q?A%0lLN|f;^SCSd>+2=8MUe>KSTZCbH zWHapg(4*r$i@NKTy^%xBm)xI|h#%$Ah+6xUcNZvnqdC>-E$y)_b18&uaTRjVJ%RHU z)%OYB%mSv~y~QllV|8$o><)d-PwldQu;x+9!wGM`j@5&obtpF6>;1h?{8-%l=i0Oga6R~rkbSKxD^Js zo@PHOoMFA&&tKH^nlK8f8{ zw_dAux3A`8T~c4cWJQKl*DcVG@yva6i?B*3sUF;9jku}w%C0Rzh`%WeqHW2TU=;V@ zm7mBKMGeF~t6)_RG~slDpf)jBs~-m1l2h^&#Bi_lb>z@LDY|K*X^)aBV)$}W;EN>N zoQ>b7(9zRkZYGKwjP=Ua!+*7@oQfFCj;(%-zovY%oKW8i4d9TYH**iamPLb$B+o?e zwYJQg`LlsTV-cqc1?e%+i}A&6C7r{eWwqRg0<+G#0GCun`>$)$rcg6Qp!09(0?A}6 zJ`ZtWUs~(4+*S;g9rY}f?B3VWBD7GLki6YgjbwQ$LvUsxg=hPveCX|EV zSZ*of+mEsF6Ny&!Rgs5E*1D33vTPAd%IfOm5Y`#G6F;nMpkJ}+i)`}h;*6?eT@SHi*bI6fOC#bWq& zcX}bxIg&6qCiu`~=xeINaVke;?xPW41ber-g8)~lsYRcDTVl0ww|*GK?}C#LNX(KakJm#Ou6pp^nrloTjDD zwtNy`eD7B3s$g7#;FD#}!L{CPUa$i!QWN}ppT(ZxO==Em+qx?`S`n^f?AH5|knI|B z5ypHr41p1b%+|d%1c9^*?cO@29-MtqZwwNfv`PUnJ?EX`;C-qE@4)No*%E};!*sG( z7+a;;hla~!J6#nnAe3G+%V? zKjXPLk1f!$)%7RH<-l7R)TQZyP48^6ZJV2#t~@&YJwYNrH?|Vgi|0Cno<*&(wF~KP z*NW@zxGnj9X`%fsEBsQ$HmVX9pY(dkn;^RfNzr1OpTOaTQ3N~nvM9YeKERxKt8U0- zuoVZFc{-jD@()dN;2+fx;-X`}B^lMwXRn~1i6j=*PsXU+PPX?fA-I?5*6Wy3L{Ds- zfMeFZxV5&c2j&2a9L3_U$@|aeey$Gb=it@;-_ZLKUZ0yzpz}1lhC?SOF<0P$g8$Z6 z7=P;*H{EUDyXFvkIPQLae$++0W*62tZ$}_}JIs1QYxutCnW=U)I(*7rB1zbpuEu9Q zp2gf?km=80jC#dz7clt(h){>kEV0$UF!3n2$)2VOw^mT#VsjwaJwgd4J<}V9J1lHY zQPOQcISS^vRc8)vde+%&Lz233&*@30B5+>4y#_3EfpU8$>u)w6P0iW%fyXg*IqG(D z(Sv6n{F`t4SJGps+Bj$5(W`V_d1{fXP^mqRWZ@}_VW)AM8PLZlyCsHpyYfWC_)IHi z3nEn3(v7LO_Nn!l2-(jH5oBE4D=c3s)4xR`wFA(d)@HnGb*`?{0sh{q55x@J(Xw%) z>gy^?4E@P?ci3G$Ul2$IoM&bg_Dnt;fRsw%r;hg#boP9lK}FOC=iqA(Car)@d`Nv! z)A7|m8iUSZD4R(1>mlDVQ*5r2U5XwHVA%Jnx>c%F{9}l1^QM}!)q`EPvnj;=FODk4 zkeG%|e78A7MC(&(5~3Q=f-Wk$>ML~pL(Tp|ZzuYG!`WQ~X@YCf(|t$NO)mw>g7P8t z&JSEXMs;zD=ZVz(R&+15ykm34!PhNceI{Go*4KGhxEVX#k4=8*NW)CN zE4TcWco_exl^}h4rPznUen{`^;CCN>NLAeIgw-R^IRKad;Uxq%y#$4%9_8S98=%9ZOi_W ztgU6sxof!~!B~he?9WtY*a!9PiyfNqQT7C52I^-)k|>)j+OVBfg#<@1X5OAJvtNsY z(|nQ%2`YM-^J*locuzM*K6glS&QVqd*z9Y;s->5J+jGROJ-Y$WdND#t>&E zsi(F(M;3+^XM(~7X!WzMCukdpfo4f95@ZfNxyTv8G+xSJ;i7;L;xyLZ(#8-CBiF?` z>MHqy_?e}CQnDIMuw3idYngcd83DTwllZL=csugSD>c>~W_5p&*P)#~Zr>QOiKx5J zzHgJQB(u_P`%EbY@#L>?;vdI!AV(}uPm(J1GV0l4gbtVD9~*Sv5s&GWS*jG~`sv~{Y;Nplw>n2us3Dt5RA8zN3yi3VfeElq z@JLZYE_^h~>r88!f#z&Aa4|JmgiZ9kUum%$DP znSNxjD8lNC_LMd==gs0B`>_{UNqM}fL{E8#io!oJzjNm~w=U~m3QMUn5qI+|$IQ*_ zrF=;LM+L^P+UB!Wp5RkAK z)GNPlK&IHG?C9yn8H>Dy4I0BqKHz>_)S#j?ad5f{2i_r;PI-u-uR5XrobRM$8Q;x3 zN0qMmPUiET&BwJto7>%jQo9B$R-Ba4mLF%c{A@z5)PGv@T=G!GTYg;oGqGKZ+u3Dl zbC}ok2lrLplvOdP+WS>gw?h}dM`e-PxZZH5t-#Y4D?{Zq-~|@G5rZf6LF!L4&-$~r z!imix_0#o?@9f&B;6YtWk$N^YW21)|9`5c-h!y?km1@jNU2)tii<4sqTs&FL>d(4f z(+Y9XiC*scjb#pvjCAx;I(PQ$)MoM9L@U4qUZ5WkB#ka{ zeL2xvNJV9_p=IQbOrI87zxtWpYGZrBkg-g=z+wStc+H;}Zo3Yq5-x0Rp=!OzJd%fvwiQ|UE;=)~6MkEF{{W-Jkdbe#~ zrh)c1!ZI><&=QK+&i#`IOuqZ^bC1*zJ7v90R_8u}X<&?-0?`lt43ppH(cZF3`nK`9 z=7N26h&*Qq6S^)1#fl$a3^*rs+uheWTU&ByRnU+JPj}zO`I-S@nSGp`HU^v?$Q`c7 z>n9WsF&@MwizSFYP4Fezf8+YRDBX_4F}8NjG%T?GZ?W^kWFe;dV|;QNsw6v>^QrIH zwF-e_%K<@Z)$@P|v z-+;XVHN)l@t4V?``ijXSmR6iXH)(896{f>YMsg{&X@KpTor?YVky<$(D}YVBi45kN zbLf4_C)ITvmJZ;-)(feeJ2qO2v_-}jD?3^$)ui{tHz_l8G0KjAv}u=mxu0*-e?GWMOdracm7 zmWX7{9=9Q1F)k9c&$5lw0BY8bBUrk%*)Ud^G(OrqyJq#+hdMrVNG)~`#dWN#sbVGo zo&52iuu+vy^V&D3hI3ML_c3<+<*pls5wBC*b#4ttk)7^CfLB9#-L<05NiXl`!4*_F zKjAIx@;fdwyo}{nki_eL4j~ zfRVcVlLH(r*v+~h8DB713khtfOrg%@qQMx9GB;W6P)w?FJ#^d(A8rCdj2+|kS;4Shxhxz-|1=o#a)E17F z+r9}AEkx(MqHg$z)B9@6G%IanBdX*D$wS?y%-men&MxsR(;Po(J>B?_t*mCOGHars z45+Y!X8lpYP6t`Tu89cVx2R`Zi6c`U@XKXsFNMPsAEfH`UeNS#^oXMQ`KZga>{qW1 znlJG7CY36+_=iV6*H&@>tkc3Dvy-xrqSpz&4#bM^&rKD|Y=GvhLkocAAlc+I<`wV8 z?x9J14^iFhwsO(WF4v@o|IpySzI$u|V#Vni&YqX)rOR73&(R$Py)Qq=Vy(KfbY-G+ zPo{#kd$R8@y|&*k80t4p*IdNW#KfcOXqq-6E{1Jl=zH>(CRX$#$u2xJQ_$sa0U}5X zkuB_JxwwM0z4U|tPL*)*tNX2zhB|ngxjE79MF!RMXOL9kb?vcZaU!pCX2y!^)H2Rb z^y*9<5}wO$nGP3@vx)dWQB@erLKJO79dFx{-3!HS%bY@d08TPa--NR^GB!-m-JC$6 z++GP`WY^!+Pw7SJW6+1F{;}bRLDT14@wmMTOc^38d^HEer%~{F+3V$CZ@~t|&y&@K zAd6iX@=2m%V7^|1rq`7?LHq7*@#TW3XO9KhkbxKk)n9hDn0>9Rf0i3VVlt$9FGu0g zP9W>f47gtQI|7XaYAGF*JF1oJ|214T+dnVX|7)2>2%gQc&RpW!Mz^!Slaf8#WW!nd zxu1Jkh~m7LDA9($~&aWMQ~Aw0S9fow8DPK^|ZJ zfE7d%Gh;w>@Sf<`-0?e;vr!clFLi;{z3(!t@A+RYh83-)57R@vf6(YwUO+7{|EDrK+F))CL}1S(C6^4UvfC-)%wFrb5s zyFhj?uL~MJ{V5MK_6T+-vQL9O(I=axtZis-@+ZKFgXB|!g^iFb)-uJD>hs!ldS2y` z56RRH@4rowlT0h+@?1;2k-|&na4q-nl%ViM5@~KdJ;w1|<(=lNs{`-b+-!($ZVW9a zvE;E>Z|&Wo@htLO5Ur;d7Zee{!=nnIE3DQFX8|6TfxbH3He!# zKXz)l!&R9|*7pdl`p>-QTp1Z@WRsfC6O9R8*(-LejJbBSJ@shL)zfR4m@dm{iP0`HE3`T23+*p^cMK zCsd7}$>e8cH2f}idV{&5KdmUtITour7tTCu&Q9tOtRGdHAMsF7ctV_%cgMc$9Rh)d zSWB5u{{UjTr{z?j=HQetSqz|m$_r#JO57HN|B1dSb-mZ1JxyesZbaeB$Dwj;gv55$ zjJeCJ{m<$n-SGG#7nntl0{71^w!<2(Cu0_wMcrJd!Q)e}pFS+D=#q09{OK}v!*jN2 zc0DlcwU%EjhAM$P{;Hv>r^N_S7OT|{brqtvs{zhCBGmO^;&mEp$!39kEsQqa6MC7M znFw1m9x4SUc~+kZ*fo2Og68`@1>D}Fv&+ioU-EXC<#!&-MvOdkTH~$<9+>Lv8tR9< z7qt_BR^rdaRmqJ8P{- zgFEeb1%Gim>fBv(;PPDdB}}6n4qf4tdoRSr$r&@lc^#m;$2%R&gz0Iume6zYAMh@rpeQ1>4W3jPVf_)JRXhpqx4bcV#^Wyv%EfUDGp#YU8s5sm(Y3=Y9k~rC?SFC`oAO z)By(AsZ@?X)ti~KC677Ugt%>21;c;3^?q6Y>pNIHfXTvBKwPKtf4D&P;qxYIjYjLK z)Vi^?wZ5lcoSfyY_}EHzKmCxFV$7=CTsW=bn*yQIob&r`Eim3XgJm)UUIdS6G1h1FpgMsQaYUjg=rt1m! z`a)V3h~xx*$XTr&?e(kMf>beAaK9s3PQO}NTZi%1?m4waE2Fgt$ebL)xb4r&r+Yh> zy0kKC^7N{!-HicLRSr)+&zO1Jg5s(Xt2N$7RQqe9XUTXaA4y)djvwWjG)E)31bE`f z;suF)^``zfM(q}F_WF&(kx=-$a7N^3=>qRe(wU4|K+H%|@=1Rca%9v~HUBJL(p3Yw zR5@#+iMcYaqq*&pk@)#Ph_dGx>khgAv66hNB(L%4cR6NuU<0gLgM~~LM%klv($&eC~Ezi@e%p9b$nKZWewhgx>rStR@PQ?A%nwqWDVRmk+XmX z_6Q1%xlK(uRVcS+@+Gc<5HCkDcP0C=Z1y>?{J@KY%YxqTMippBw?t8Ip}>Fcqif$q zpXB!>ul>~JgcAb!_P1R0(t60g#0sO^;kqP3M5G!J(^dTsQ27gqZA=rBmaLdWnG>`dIri;SO#3b>{{lmy^&xJ5MSbsNhLQQcexmKcksO}5PAChKc$ZMGbMl^vmoyz zZHc3pMK8>^<^@SLMUb@d(44$Nogq6uN2HjfiT|o~A!DI0JEuWC%hc4A#YR}3R$&Ks z-{Y7-8uyo!@p%`+km{DFBFReA2h%Pc*&=&u?;RWF&nL@l0>4NFuorpUgj_5|)2sQ# zvAY_`DnwO3FIviyjA{7jHxLYofy;Y;8 z@g%O$<;$0W%r3Ku4@HE|E&)k3J)9tpslmH{argdzA>!YIcaZRh#kQ=?;ZV^CT{Ltw zxHJe@Aq4`heIo_~QR0hdZ<=C*nGa>W#UE%iMwPP`j{|4e0@V#c^2MI}=1KHEVmLTf z*pXfFrQe`bJp`U#1fX2b3tM!er|vjCnhc(E8GM)eBy91q&iW`L+nKJLhw@Vb&fH+A z)T#BH0E@U5=0Yy#n%Go#dVi>$;>u=jWki!RN*V9@4k~hbyjS;^)Z_yU#C$Oc?WrXG z`ZcI;E5erUNh%Ru1JrsOs)X~{V_D}cxZ$)`Xzx^w2ssyB_E4Hod}XKZ1a!6^Q=f+J zS=7yir`X4!JfqDTRq?w2UAv~7kx_c>*?pVJfgjP;^c`GwL)PV)oOy|kz#0yGt?Raw zCN2&o;Un&`8kbPycC;sWX7R)hc?N|)=UP&HO+v`mv+mg`xwymtU8obg=|^4wqySUS6}2x5D$YM)a);6 z-(sc78~oX-;-_F;T7)V^M+nP%zs~;yLPED&T5WpP)Doeld0~5DicrAZkdh9_g6iep zF#=DimTjaQIwvOE;R*HVh(Qj@ z$hwt%&Bg(_YMW;xjzvf)i zvSbe%>2JdOU{_UA@&a)KBxrAM&uNKnfo<=(E`oQw;g@r5BB+{JO_?J2q?cH=M-6*{ z=0w8<)edQLpBXHXDoV*7=eP1sY%3aT0RGILnLfjE#s8r2cRN5?-@LL{bZqI6-ZAu}?x>9JwO`pfvDnf#X$8I?q z9A@{*@y*=@9P_yd3~r-1p^Hwf>1Q#V2ED_>a|i(mm-h}ZF;v5?yLX!6`s9y;w>7Y< zDn`=auIeMIv6Ajhb&aS57|)7;%hZwlekSL20aVcCT`xF)F(3gBDt;WFSGVmk1uo4s zL8kpYyNV{#AT$1o!s`7W#7dp1;#g$HwW{P2H-h7NO%81ukE%IdRP3ni@b8stN z9C0{E?ba;R8&t^OjZy+~n$Buj2i`2Hchhv(E6~ z)ZW-i9F&~d=fHYK3q$U8sR3h_%z#?Pd=w?t_XKWfQ-b)De7N_~*hU;x(qR*ZTXbev z=%2`#{=~!&lPaUBa%eJV7>En*<+&C#P6)rAqRHH z%X@2t=3D6H@=j0cD+L}KJ!bG#T{P|S_B5+BNZ>szBr!_<1)o;YPQNq_&<+(sovMe< z0;tlc_pz4TMn(FrSck=X~ zxgWniOJq5!ZlCdL|2aP^y23isxr?(^xK_dR(>{ZpXl9L1+XrA_A|O9ifF!jB zG`K;4nK`W4L1VvQPc#u>wm3^Mhd6^&!%$JE>6{4S$ON+d1dF1JSnM$*cxAZnFcn`9 zdpbC07f|v*OeFu!7cg}LK&wcjY=S!&Jv*jajE$82oJjxrv!L)tVX1X7~ zd_+_lr^)bVkn-spt|B=cdD|ESF8m(imCXhG~5E}y)eYBvt# z44V%L%!UuYY@guSi4NVW(ajrCdYkuu+u-V=5C*ZD!JLM6V_m zIgW1Dh~xDzK2%Gf>iQjRXRKd^V4CfXE(_1ImG}%pBHCIOj>w=k$0@ig+^FI^*Fy2Y zSw&Qjw37+dycx#kdLk6nf0L^S@}Otq1scGWLQ*#r%8|nH?3~W}&-IWwBV^>Ss67_! zgz-AL$Ue2amo!Kfzq-C|ZaDj%7FsrWm(PB~D=05nysTx*zU#`S!JzXpm=dsY(zict z?);i(M9}N9sz;b3Wc%<4)!PS~oji-KY6%vnGvARORGmYVDZH;dSbhlo>M80_kX5vl z^yS-?4> z|G>)imPrXI*yxHRDR5NM*m?LBxn9Z-bnf6{<7!kZE~Blqb;PAvA4w4G+t}p58awe# zAwAdrP^dit=en1br@BR6LT28Zg0(%Ys z0<{$3T|!ys$Q8%BpnC2LnERljWoJ%{Cp!j3EsAa_1!wpoKbz+B~I6yKaPewt?W0}qq?ES z8@8jA=NlbVN#I*x%0mo8#d}3pC%5{z+CVa@aSv*u3_-y+r;Egy@gl-n<15> zkaE!}4(3O^Q~JsA*kcMvS*QFH=5v|#-nY?J=TkXVJ>ZvO_n(AmOI%VnIKqm7z77g> zoc$IhqfHnq7D+Sbi3DB!=}PTyz9J+HNX@M*zHKMLcA^Fg%vO#Q?Jo-8N-plNL$S~g z2u#_BKcdE-SIql5fFqjv>gr3+4&oaw9~m(oIt@8ef=Rf5{6$$Hlln~5@RGW@y-Tuh zvM#y*kL^D;L9~@pJwm)UjUUA_ar=b_N_DA6OANfcXA0~`#@S0z;sGTEJ-2@UDEHSG zS^OTemLUQHmG=(eg*FmMAZ#~L-J6~03|boY>&~xw1x}9-!!Du&lAWPw#|jp zQLNRoymBhw?vph`qj2+CD+WYaS$N@?@B%o(T#q_??Rg6B3`Ptc2-QPn8>8$Q=wwUvD==(Mgb+imoOdCp}StHHh2 zi!uOyTt^x#VfBa`9(dz z4PEj<&hGi5twT*oNNd{ud+(xJ+d4gKVXns&7k85+wf_MA+GAFx`_s|p85!z29+w)^ z)?lVKOa0VM6vsA*>Q2KX`*3(>qGVDa#Q#&!WHZ@%f-@o6O(vWrze4@95rfczdg<#* zfmzMWiS=E*MEg8HkeZGM%60=}eeH$6Y_fH7s*3={xV=5f>sxat2AdtL9hpLPr#s}Y zrb_Fb>h84|xwU0`43LpWRf|R0RdbU@ROs(GYVgxZv?kv3{xDNEd0JVZW0@0P^|PO8f5%0(%w6+scl;u-Xe$% z5U|ljDbl4$F9On=^bXP?(t8&b5ot;Zz4sD&fDoFBbOO>MkkBFY9zsia~_;`*{FFkpS>u5DPHnLWE_; zSH!W^4!QwJYw0FVXZYyTUiy> zD^l;bId*)X(utMUYdhxsa<3TNxF-xJxUHMiCY{ohb6(NJVl~px(=0A-|7Jz9QpS^q zl&m;F6E*GVaU4)3^K08|OW|6o(^aoo@S?ne|CRfc%q{j6x5MJnl#@kTycF#csy_x| zzndPA!^sp-PnWP$t)P4<`~2X_73c5lbBx#q)v!oXh~WImFjb&DX~l`<8^rS4>Cy)I z2b^$UokTPxvR;!eNOUB;q9{ZmC3uvK(JjJZrDM% z97WF?VLEjx#SR;tFsdZ-H)cmP77+~ixzeUXw-S<)`nIt+g{20`lWHP5A2yPDRHy0i z$dr|1uTR^uv*Ac}rw%f#^yYP-`n&B#!7Qne;JqB1^FViej*=hWmb3n>MrpOpU#WN8 z<)+zgt4UKDylNx{`^ zU6+R?1cz8!Q?l=poHZ1?(Wa$NMu>?>eAk8hBJfK(~NU=-ss_E*r93KA|kA|R^1jJ zW9r`Ju1#$;{5KW9dfb);qpd*`GP%zSKxq4Tg|#NtoY`Ly9@a?eNg2YGCT?>BRj^5NI?-8E(b(J|wx6@y}TRAB=lnbGwPmL$tH@TXAeX=Str~pqU~0 znkdLRr|0w<@8E{4(PrGqufzAB48t##fGT%FvmD?_^nK0-Q?y_8W$f*>y`Z((qH7t+ zUA%P4h9&iLeh1INtJ|fQ+N{9euA}qTOcb5gD$x%;ZXCUH+%NL57lK6K%!Z}Nl3255 zkK=9(iCpt3!#7P%x4z>a-|r?|&D1|N*PKck?PM6^AjIb;|Ms@Bi7vyIPJas(xw>NU zTMOL_M}Gem7~yK^4O6;8vAb-6`x_#p3cpJ8<9*_7Ieg)@B0jlN{wyun-h*o-~ya1n- zIenjGgo{?f8Z~3P9&G!;19W~XxjM=HjpF(x8w-nUYg?a@Y0zFPeEMO}H~NSelE|*g z^WZ?6o9Fqnh{h8fn+{?Pi)8SLDhH2h0^6MDzL*v!<=op2?<7)cj z6<31_3|a5&Z1%SdoCXoyqPU;O+QM4j;zG&^jLk_4yRz^}Q*q4^V6E%%T0m$_Q9CGX z6izfMIKf4lggf;Bd|e9}XrxsKTOK`V+#+D?a5g=lYI>&%&B9-Q6eg--zZE6NpINs~=8VR~xpaOMHhfQ@ z>!>BlsZZ?D0Q^p0MxggEKM!7P%VvF8wy&>Pk21qTGYcL;$c z?Espo#Us}?CKfDiBlqeU61rdYCJU$3QyzG>MnsM+avr&b=4fxOLa5q1FZ1r(6+41# zGCxFN#Fi#YINaw`6qxuVB~2@t-Oe_YZmk5&6HPP+=qvSyD}Cp9#K&jp5`NnsV2)%l z#}>6Eh8&-?^$E4@Ize3L;=;!JD%WUc++$5Po5j~ZPw%~LP+Tw7I)x6LIV9nKiOrgz;D5ivX2|MXdgGJ~qbBCS5!tEwS5w#j!@ zYdRgDMHUbk?P~(l4ObT`>4C=-ZK6rNv+OG~Z*o$4JoFXa&YoJHHK|Pev~T;F@>g!- zm!j3bUXZR}f1On}u(e}IM*vO0+x3P{Nw7q*&+Y6Li!mA}dKC0AM#1ND`OVO&QJJ>f z`eED`0C{ZcLXaa=!6~G)UZccG6+gT4?*U`+^y-at=zVkV+buT;ynf*2lt#Nvj4HNk zad;=&M3b@U&X`)eSMrucex1vkmK*9(zif4{awQPGT*ju!y}6V)oFn7zrCC7=EBIju zuW=16ll5}pmC%J&7@MqAH8%T&)L|9V{4N{n_JVZdew@zscUE}7RpJ0q9fK^{uz6}@ zQBJtxu$tYGpUIlby{_J+{@OcB6XxQMZz#DtMVCcwo7>C@*o!~ZoDq6HTC%)N7krE( zJ1Z66!TI#@WJ!1EPyg4G0$ELxyDVw59&g zCrG5O%#*feoUX#+vMFeue*1Prne_Mco~W`x$2V(}9x8WWRPTPFi@nVGT_9Og;ZanCzB6W0Hf9&HjkU27GZ?S=k=$g z(?=s!V^7%A*iT%wOkJQ&P5Dr$F@1pe7|V^z-A!JA0xPGqawOt@XzD8NRDMuwtaIg= zPx`)qP$1mK!?gleX8S9*@=L$>mkW=`F3?pOMa?4oRC_!}lyyB?Rwu{V*Jcr6?2{o) zQWk0Jw3lHSWwe`mr7v;u0~)294Wso5&abjjSYB|;GbcR7I{kH|#i9Ok7I6y`S3CQa zVh4i2PlW3H&gXIWE`v5>)5X^r>O#a)J}pz%R+K9D+fV^bYTehml=?1bc7Vs!}2 zMc)jT5MWHU{2`vaoEj2`9#_c72EVr^XpEn3;!X#&%r<*dry5UMW4>C>d-H55D0sS} zNT5E{X~9Gk5pU9^e4bZ@pl00g@FqJ`cwuzf zB3=>%1HR`TYMarsJD#V&0A(CD+b}iv1z2_#)ii#*AC(p%k)qobm_tF5}C)o=}p9v-zD-&;(_o!38Dd>P&DLe#HT6p614Jr|4Y zn%>$-rw;m|WvR$p$QC>H^e0CATD15HDD79t8zt*xZuj#2rP4%MZdS~ZzRhLd#Jd>R zJEpgB-i<8id^m1y$Yt%i^*jxWW{{ut-9gXI|e)iDoXeAr}MU) z?c+n5{k?nZVx7hAL1QKE@7i1ULcR(Qh3qvZfM%HTzFCJLx9oO=GEGI*e@=AwKaFT{PR zlsq?J_cQat?r=fh@Yna>I(>zZV6PO8U_6%!z+AZ3Wk?@*20>1( zKNUrD8^&=>)F7@s?nE{YF_PX${gg1ocs#85Qu-xf91kI};^ol5oAH|0FIe?8&cBUz zg7iJrtFe?*fqKc}2bTMkmk9A# z?j6%N<=XWPtaFIBEr(2OedK9NZ``sMS?B=Q*e=~S#2>cM?*xdWQUed0+)0}B)v|o> znkwyjPbN@L$j!O)ozM4~_;W!-8vhvmI{LKGs=KYUa2#RI!1^3i2=ek6c`FstPE#Ap zd^!KS*DHTEZ;$BjZ$6R>>FLRB4k3qGm+KK3&4W@qv05MxG0ay#U#`>xOdxretbS=X(4paCzVwRD7lIzvWH$SLQVNN?-L)eGf zOfV_xKVok2hO;MkDzf^Ey8ha?s48(mrD`%qus2O+v-2xI*odM_85qxTH!!R-6XX>_ zgxQf%$PmWpk%(^)q3|-7{4L*%7@RaX_lAJv_g9t{W0wo6rFnP>XgSFJbMi=1A)8@1*wI2f#i6eKklK zPE#Gwe5JPi_V$iFD_0muY3m0Glg$bwZ{xulgSKyE`Arz=v^vj7g~c(7su0_KTf%{s*Pt= znT@y23pkiOW|jDA?gTx8OXY8$KD#xQ*E#dBw5sD*lEL3|sh?cg?>;VcmDxh*JF*8R#ecJ+w>x~Mqf%UFblsHUG&g` zyfz-}^MX&ub$_wve}0FU>lgaU1Z3moVPi}V9_xa<75l|bYCwP#f8h`Irv3C@;l%DV z#J=DR3B+rW^UR+-Dz`GhMcq`f2xeI0W_&u1rn7W96vKp8p00ooc)%wvejkf3 z$s7^7heQVP`9)YHdH zC24%i8N>U%zBMz`Y;|)pv2|K9Xd}K=GN4Wp%yaL;c2o-g;-0=a=a}IADW4ZqXhid; zlP3S;9b!pN58G2E$(HJ#Ghw57gq#<+KTF71kH?&y1IYQ|*ojMvMnzfU^nwyg_)~w3 zicjUc;Ibs0wJya+;zRsc3e>nrC6%O|l}CKY2giy1PfE6cu28~CXHnyZ2ScEEzPO3P z8L?)0_6s0xcla^3KFr73$;VdS)9zIgx6q?PHL0)8*)s&u&*FOW#rJj|sGHV!mZbYn z8}bEUmC1vURf?ZHYBZm*z`*7(j;$A)*ZlVk}!-B1-KEX;k$+=+vXmjDIer$z(tPC6r=v6Gj2zapTI3WyZb#R}S*O%OVF z>?=xcm2ntP$s~yuGaUJ4S1OPm9CqVczZfCw(O!-<$bK?9GOp#nZk9h-p#_3)!>+k@ zo!VM2==HuZwBng9U@8V+3A`KoqlHX0D74^Y(r34v$bAHtBy%S~lV4RYBlu&tY1?(Q z#^|TnIdumy|BQ{P7PZn+%i$!0`wcV43C#!dl$2h|d0XqO7gWJ#F+)w_$W;-sdZ#3E zET*f}AOfGC`Dh=-@}W4UuPG1J=T^21(E27)<7-wXzO%?(0;;5OO5wLv;t><{+see! z?G10q)_8SEu8JarmPONsCMFDrnoAz{#8C(V2%eRxByn@E@4XEV&sc=W%6>^T2vCf_ z3+)pcmU;RmlbjV?+oJzigv$55}N1kY@vt9L5jjtM?q zwpMSuWB(xWP!DyyYL>BEO55|o3z*bDzI@7&9y*#lMMFJepjY$2-)=tZYtzWMij_*< zhTrp~4J5?)lAuGQP@moSIaJS+{K613aP^P-2s>m<;s$?de+eVk*bR>Bf z6D@(Z+U(tyY#Q*15RV3!!?UtW(gddmsvPz&n);gci<@X4y?HrAbbhp1zT#@A1M7z& zvZ;)jp~cbuNQQB;8K>>-_}4)#?!|3F*zXli>#Wtzg?E3|p(MRZ0N!;>F*Ig%N~QI& zHEpRIb5xU$wcA|Rd6phhgrd7R6I2EbAK0Z=>8v?Y<|N-qf5zG%Q5Dp`SOR zP%SS&8wfAW$CA~u^%8A7H~IH1npj{1o)1yN^s$j+mhOm2IA`Ixhch#e-M&&|eL(?p zke*A>Ci8H{$D0xo2BGq5_s?j15ti9L?#)TonflDJ>*xS}14ruh*Wpx77?O4sTfl2) z7<`oG%e$=p#{##zP1ak&j`*?V)n=Y{pw6qeLsa9pFTDjaw8#L>ES zW?J;UokE_GZq&ntjHwK6To;wclZV&tNS{_71&|4wUF+P{2%gL|v*&HbR`45jie$GZ zib>2gKLS!>{w0RM0c5a5PNhUr--vszylrjZZ<|x_I{SS4VAW_Zb+k z3>QxW2^=t{}U}JLyVpw27H%N*~ zOfk%^W1ZS&e@?{xik zks)Oslq8~GL~uI_BOuQQT?aZzQeR!1rkWD*^sh&mTErP0=ywXxNL+|D``{B~6%<`= zI?iJ3?FG2sGfyGQZ8pTB#}&H8<>L|;1ItW5_4HJ2lgkxhT!~V>mn`ffAKmR69L`*- z5R!SF>@af7H}`SPdd5a5wdGt}?5Mz^db(I{8%Hi1pw@lJXw6`~ALyl!&U?NogK8pH z|2#2zKLkY6*Wb*%WzhL-txA+UX>2{VdUX|VD&s`1p+p3~@yRw#i7iGzLwHPyNefUn zr@lAYM7}uf0xT}_!#;rZP3{d3ue`adMEbttAg!@qEBFnc#>=H&*pB}YY>yHNokt@h z_}nTc479#0Gs7e%9v8c&RPH9(2j#pv{UF@%s_~8dz3}!sU>AoNTnWNP=t79`dWzBU z4yNQRae4Aj3ii{ho~ZlrunD)6z_Y$7JkR{=Dz zjCxI-2tT?P4&JVcnX(%EFveI-X860@_IKYZ-ZcBM8JAiFb=$ZB^l=a(T{#ZW<4#$9 zWZgy!`!QlcIG1o-puYFGcDc`q*gG6{+R!)NTi~>xkD1NXJoly788l>WkQ{k1D2bh_ zsV6y)G+cX#V2kEATDoYCeczuh#Z#v*s}gB~!(qDP1Qq&1uxPsxtJS4ddH;uHa~iwG zhVgX|_OlM_T_#xUGWPdOv{yN_?o~v5sBGO+^&24Sx>e^sRx`2JA9FFz6^E_QX3kLp zietDcMPw`5(9c*Sob5HqLhv44b#Mi=f$iq$a_%4yVt1Xx?cN<#0rk z^%$ShC{uGxdDpl|t@S`kQ8!ysI*-PAaNgP09hyZ~e5z~H$B4dZThecSE_`X8W9A{h zhJ?B|-89!VnmfIU@_TdTlvH_nEP>Ch`fcz2!DW82y?b6s$a1+J+?-}ay ztKc`=%Cm1Rd=!SOFA9JXmD9zHttzY4?z1DQQCsgU$uEVLJala`8$B(W54+{6Rws+|>bLn7TXXHW@sl(Sn!8TC-3LNR_<4=?0N02TGim=Rv7X>Zt2|*zay0L;ZCPt-(p0C_k`F`l4RrsH39#f{=R(N+jC`1G{9=N zWbZWzO+i^LVAM(b_=2{_@C1QJ#g#!44ZkJmOiH4FknqBh$KXe8GrtJ&#yO!+TblEq zhon27*lHnmszPjoRjjARL30kYiAn;-qgHl9LTu5r&7RtvpuXGe(i*v+o4Q_ZAp0wOCol9Al>?S2J}uD`)7Dyjbmq z`ZoB0v4E6t`d9_vh3iSFfYQE^S~hgA!)tG$txcYEb0SHwVJHTN3x?oM;k`YBnT%a6 zt9&ANr&#%E?%Zq=M>SJJ@u#x=-Twa1-@6gr-a_5!?C%`Il1{l)e%Z?AE%jgr1a9L@ z|82KVKs`a|J+fl=(tS~(&-WgU5pHyT4;c~7kos+9-yeJEUvJ9sD?uVzi+~B1p=GYl zeJQkuO;cBwIT{!!17Kq=VMuoD@gRN+YKrhY&8VjboM(^cSP%Qrj&}7QRvnVW+P8J? zPHru{Gk8(7rchNlRU&!%$N=@)5FM+d;`tECy<}wY`Zt1j<90t7O7v^H$4r`)(kD=U z?B>`f5m$5GSCw}j!{0V5*fECuYufb|#klFinxZ%Q3%o^}hhGJr zID3^E)gT;|>_3~d!eeJ$nAGX;(o>5xsCBC?V3+-PZ=98hYN*lf6QAE^Zle3qSFX_M z-p6GJEk%GWs=b9QB#Z2ci*~RQ*82PDg=(qUx;@V#+vB`dy`~%=msNC@>n8{mc`eys zNWpP=>g@2b_( z*EjC>&VfY8nQ%*N`yS5?hOmD5f~zgddyuXuRQK*8q4EuT2RBMoC%SE_t7T=IXmngi zIb?gT*_h069V4TmKQelbkjjy+i}9MX(#l{Y(paV)W#_kCqk)(vCYb#5P3nIV+4j|r|d)?dol-!?Kg zY&ZE`>-f8Eq>%7KX^Ab?Mp=_fTQprZxF0QweWYJ@zaZr9f#>eLDE{5OYra=JH}mr2 zPd*JE;=O|$&<6sW~asKQgB=5cF;u6hF#Ncfi;K7;F2=`{-f;7VIoa~}A zRr$uYqXU$>up(PcjA=#tNWb8z^#%noyPx;^h-rIp{WlZsvIq&}VkU65mIZlu(yX9D zxCUNG6{wq3Vt4Fu&B$+D&Ci>-;$8&hhsXYd$0)S6m%g=ySRcwvRGk+be2rQOIe#Iw zkjRH>a>+kspLho!?;G!^b{`oGrku1r$nre-0Z8(zl%hLDQHoC5c>?wIZ#zBc$_?7o zL$;`CcgfE5T*Ze-RbA6UW7_L1Jm8Ty`2Fu1P}k5rV1FFkM02vG#R||eN zPFHI{k6fH-Kz#f5%-e+E-i@1hAew)98_qe`Xmg$JRFI{y72%EV<=&uScH5GkIZ#eF zE>oIaIJs|me%qee%seaUd&C+r80wl_57j&^_Lig;q4)sTHq9o!E6+if0)f1 zThR15`qqj&MUOt~-nmg4^KX@ay3^nPttE#w0!ES?z-3$;8` zZ$1Ds%MHPuO>Z?<#J#Gz{9pR+%hwF%#~xCmj679H*JoZjN-QNU2)ses3eqp#M0Pl% z_FQ}-o%JbD@^(s0gz}W{R%f$f9y8`v%Tl8rgLnwnU^)Q}lJ)i(STrSRi!6=F<%vH3Tw5{T4BCdF5FK)K; z>X}QYfjD=yuj<=yE?%2#!g{y=0UQ7Jb-Q*tWLrqv_3PIaqj5ew1p+^U<59T}1?PFv zDzeeE^qfxHv!z}D#dMm3Y`PX{KpFBH`*6@v)#%DhEb+(u)F9Tz^zGJGP-?jqa+P<21*SIM#elt|t)3Qfx;LCMuF zR!O}V-s&OmqTx!PHhEYEmK2-Jr|8@$Y}QsWNOI}1rTd=h@*$Y85Ym3^kB#K8uTruK zQCr7=52I=ZpU~Ah?!R8L@^>v97XpCu>wzW>aZ8RQ>hlQYtCTc<55i8ae$e zAn*VW?{FEo&ML8SmwQMf+Bd?0!c3)boq0@6%F#W-Q%pkP^ld!fY=6UHRecM3(mSRF zw_~DmQ}s{TJvo(Nw=@}_*#Lf3<1#X~QSylFFL8+zj?gSzzLQ?|k50PKE0o3K=Ue{U zabtVOT(KfjN&D)H-?U*#x`Prd4^BLw$_c4J5qJ0&i=XcT*6J-L~iV^NP8>aK4o?8i3f=T-d1l~+88z9F{tZXHD_Y5!feZEM0 zi?hl)6zO8@@8DDs|AqKeh3o@<*sE>4z$k!Vc=|$7QAJ9$EMV8r~E+Nj-k;at2|_H>ajf z9mYbaFOKlKRj}A#C{Uei>+aQrC(S+=rRK_}_~Vp=)-hA}?fU)l%9NvtWgG}he4LgI zTHiUhMK!W{k!?yb)uIMT2@leAPb7eq0(Al?8g|GzTnbw)Fp$hv1`B@rjCbv`$y1OG z-+xIeKPXs052XscoHBQ{nz-DYM{UF@QIn9YLcz5Th&PE9GTAQRj?v?rq96S(tICG@ z=**^WE|1aF;UdS4>k6H1$Mkl;j^ns>rE+5L09xeBm^UlrAkwd4V@(YdpCTfD5s<6C z`7OeORVG8?&(sEsT(*&v+>~Qbm`?*?3(ys=RI$$Volco`5>2t?Z-wm{HDD*NL}SRH zL9o2e)dt>88hVK@@?n+lcmBlfO}vJkXl2_E{5k+quR#!z48TIP)ip>e{y4zwu6ZaC z7`;clpVUKUJ_(%m1z1IviyfP+2JO^)n(IV&L=n}@LCF0M9n|{MNY@&MO+!0Zq-w5J zk}wdx@*Nm`qu>mcg|+NOo4LTcx`G4rXKDEhh21_w!(#cCiAj-up%bCYpDq&PO;{Cs zy@;@mSq*Br)9B-63e=?Epfdo7G8dmUkx?Ly@QB13@r8JXmX@+RI5>PfJoJuOUvKQr z`F1B?p2oN1Pb97g8`fKi{sPQm50x?tH~$1)T@Vi^i^d2WI~tepkl72hlVG^LauGl9&D zUU4gqHKr=10H^J56zeBlvcpOADrhnYpgA~gJ6PN=zew@XKb@yV?`2M>Oh!8{1NL>h z!FXTY7riET?))(jkJf_WY(& zh6PS>ZfUEzeM6dGTwB)8du4YnGn2N(^A`KgQ7v>4e~^U!%0amw8vG60EOIxp17bMp zDR*yZa*YK>M@@y@9`RD+8Wy~nl(s$bP(wUEgHy{Mj-f5P%uwQzc64P zQ94Pj#6-a-EPQuyV1iz$g+_Swg{;eU+&iw(^rlcttKjgNn%}lQQYxQcrVZ;#4<#3= zJI@wBJ>qvi*zF>mhYtAOKd)>iIXJW#h|RS!ICt6%X~hZpZKGNrMzEZog;%SXwp(sY z^#9EL|5%!T=N?&9+fTuRG7OvgGF`Z^(JN5e$3Ha)SQz2?e7A@|i01 z%8MYm>Z>FkMmdy`$#-n#O`yk{G4~H`*$GCJX3_rDKyjhc8sm$m<>-iFg5?M+hR-{U zAmGhYQP8o=%dt-sy~ds-5gsZpt*-pNRaI3FEe?4nDpDC&`%^2p#nsEcSNv#f4#r1ef}eu!dU(U~>u~Z9hDXMj%^_<+d*LBCR(FJ9>BNV$`Ykex@UR^`TQhj@l>NO>CA4svb= zx2&ywqx^8&gHM-tyEaO$>EM(rMO7JpV*HsUEDWNpoedttilK2a^bXyP9g}ZaR%6F{ zw(0$pw}NMFd5C>G%QwEveXC7TQTvRguPCVx*!M^(H8AnNbdl!;q(}`i-RXM-|6*ih zwAdbcG0&vPZn0I*SD`+;*YD20xor6$cG!2-{i4<6f!4-kZ~HrtatlLKOAaq1qPh+N(6J$mSUn+VyXRb}*%|hevbX8GcVb)u#N*WWU54 zjmEDhNxD)Rb`xupm?NUu-L|NsbWQk@kZ9e;bH>C z3nh>fVZP3AWNbKbz#o5t#r5l+)#B2%q|iU>NFVhOrj}8;j8wV;$1)!_PS)6ALOz%5~Kl?33ZZ1K|d#iK7-X}rn19#zfzo`$F#**%7k zT{wk?P9LH`#m3%3^RTUPM9Gy}I3A4^qtmHaNX za&O4lk>qh7#@wL$pj@PyecL0V=I#5fm2J#62AmH;rY1~KIB4B?r`)cR9x(GoqxY6w z#mCY$BZqCO1ma9z`K_QGU>wfW!d_TpZIy0gC4SjZH}2h1@N<>%!Nj(+r1QieVzH%F zc(A7tb0kbTeM;1S-eh}|{h(BPsmXuUZ8LH%CSck**LXW}F-j!#>|ss{Ri%TOr%**( zXN=D_f;qqp!3CIyK+_kYzug~?dh7)zh0!_5e6*r@pFZeGSQ!73c`BwfQ0*d;TDR){{23Hx zS~NznBCorlHzwqOMHLfJ5dXq}Co5i{K&j_T20ZvPv*-HeS_k^|01f4pBA`1P&@<1) z-XMOM z(8{x-vni=S&G|Shvju|VAymjiiIy!)u!2H(f4YcAovXHEIb-H!)4{06Er*~fnIH%$ zLZ1#ZSo(3}W)&>p9Zu|7COJup$nw+CTh9C(#}ygj4T&^xmL?GFHQlgRv3BW;!5OCn z{G8wV_Iv+)qJOT* zzkj9KEWOsi7in&={C>lnk&FLc-_KCYX1bu#L2WaS;1@760mRUt-%GYdD5e8g{Zhw^ z@%l)L;&)hd2c%H?$-M^YU7=Z2jFl9}vEx>b+bTAHYflsu`2ewbblHj=-+A}9z)sfu z0iuUeX+MGJQ47(=gOT;JvJBDMdf!Og9HUzPIx7-f?;)P-uSy5?sN)%vN{*Vx?7o*W z*ZYUjYG1th&f#;S5XeYKL?h-Wm#uiM*?Y^z* zccXD>+AgC5B4#Ga#Iv>f;bihnf5zD2s2munk`BGj8V@0Uzd`q-0`G8ZsI-C`BXVnP z@wZSuLL+12K7)*a)%ID0}{QvQyC71u?sj5LJhlB* z;O!O`{>WTJ$&-2o^5TxWhhFDR<2;FtlJJ@(h$w4gEIe+d?YDiwMR$<*17G7c-on^J z|Fd+x)9FH0$qSj+zJ;jya?80W%l#FCEQ!)b@#L&yC2oBG!VKD12*4-LxAh{`ng9_V z8BEX;xu)QNd&m%9#i>=db%wZ)QA})kS#){-_>^n@WhS&lFlLThq;xD;|HB_K!@Wm_ zM3$+Sw}Vvl`cMMToH12t(z|mbJV2{@r#S1i#t$AEb+CAIDKVx&r|DcOY%^itR`1R; zoc-?>tlKCdN+i^X{ljJcsxNi+_29?dS#1~@ z$l*!!-UCoiex<~=X)Fg_Hwr9K% zD$PuRI$R%I?_v)p_3AbcTF#Ok5w%ns9z#;D0bI5((`lez7e;kJ)SUP`o2@Z3vZY!P zu3k;?g!oL_lqXYwM458ic77os3nPk(oro)CZ<~n$HRAoY50cTR-*1pKJznVcJ3%vu zBNPg?nOU~8fu({=YP*ArX)5D;rc>$vx+Z^XCH{n9vLwMYk4+5b)_z*t0v9a!r*&Jr zT_xwA2Cjffm}qTJG?gMcAi$OFjyP|hJIDeuR6--}fC9c`WPAHrBFQr%c1Bor)3Q4# z$w3hQW?V}d%Iz<=4l;5XKgk|{4jQR8uoKF+i6J^$LwUMnZQG6M+u=9EhD_i)`>C3=W~phY7GX~HSWAuJW&zYHLdDz89tQRRCMfF-fk(oV(;)s0vx~|l1i-tP zH7Q|j+^$$dUwqnTW~VC^Ej2Ja%l})+%*pPyHEzS!5bB=EY4}LncJM_4E|k&FEhKi| ztKkjs%NL_~r6A8TG&9)f)v7_cvLnTqmbv}|wP^70LmpPAtIXJ?v1#- z*v|C*QY|IGYmXl}U#UY*{tVE0aGZoCue>~BQ2APjW$M>n#j5oe$&!&#c{(BNKuUPZ z+#4k@JEjV~t01q2Pkq3D*{l551^wfh|K$QZr^OZFJoWSdwG>pdGF&L>u2oS5)U=G* zm#d(BbbjIEh1D!5 zs`Ko_HjY7q5@gm$7(A(|@r@U1HI*l+ihCvw>N%^iM*^G}^vDrz-woux>0{gfQyBk0 z!AqzTqlMI?qCbL-|AA-}qXom}v}T6u+Fk9DFTmnl)`#ly_DU6eGUZz3r8m^n&L+?o6tnhu+P<23q^-G=i}9?HOrwyqFGeONnbJ zGtnlfk3i+jV|cv3J|)MB^gX40u|_w%HKgbOO?Io!6@%lhrhXdHWyNQwS4#`FjuCGN z($MR!sIWimxvJV#cgx<%Df(>kl=zbJ`-$O%pcywiJ3FQ7n8l}RC)+gPmrgTO>{9`l z^*crgpD^;im^60hzJP|I2Tmsn!F|T_=BuesDtP6LX+WJkt)P;2Q&cw|lGPL^r4oRl_`j$n|QvrQ%Je z>*i7z&2F^nM*pqg88b}Ho>Qe+JhLaUXao?!3*P; zc@KOm#OlzJ3e433!&2f$;ExQ4JgN$aT4>Xu! z;{vvhLHw-etY55Sg(W7Ch5-=m&g9}R$9C4S))>NilI#8@L>Kc!(n6W%c4?)ouEH_| z0YFZJs(a0E^KuDAn@--RGAu35&E;=QPtA>*xGANlsf4w<3B<6v~i}J?0%@U^- zvtd8vp#~~f9J_#QVVfsO0yOU`ruPAqI?Nk&8Y$7c#741^56?6NV1h27 zW|V7)4$<_$O28h%r$RyrC^*=iDNXjr-*3++e+Q6h!tfY!WlilRdyhW6Yj5GG&;+UCwp|sUubY@{26iTJdakGFJ6yYesKx-rmIWwJxwO9#5(ETD0U98lMTbf94f#2|9aeoLY4FmoV9D8@5rfVchr{WCkr5dXXV?R zSe=>ZNnNfym%~O(uHGBgqUD=ml{6lGTI&zrBk+hbH`8l zO?B@Tw6#d2N4e>TJf2=|GnL%Y>s_MeWFaNsQB0ky0A}Tbx(5mHyO25DP-`Sy z#l*ayFCfVDS^q2EWyyjCvKZc?q34;`!jx}GRZS&AkK4E{)BAh#QYhO)3#FAd zbjQWL@Uqw>bnPbQ=%+50c-?HSXB_%GW?bhrST?nGe8G8!7o;2kF_eEBE?b0v?sy(& z0bCMjkF7HNwu(A#?ililGGod&rZ+N&*a|KlD-rQ`deAOMr7YyS!}_Rr9`O(L^XjUL zY>t{B57fv*r_G?Osjs9x32rH+PmORmc|%=3GN&w{K~QK}_d^BT!Lp;2n{#=|lhm}d z{2jv2+`0JdzCbB0#iq|&ccxl!sPtzqp;w@Nm!%)&W-p1v812*_5U9emaTe0rJves9s%eRE{g9nI4!OKr}fgq zPiiO@64Hbl^e|jP@;jp(iNY8YC*s<(kZP(YFN-meYW`-r5xOn2Aw_hOQMTbQAUIy0(xm&C= z7xCrOG`k2kYQ$p$U${WNvbmYYp7hyEl>&eGIk0iZo99RC{Ms0g* z3$~WFMyKW`M z4fr>&+UqEGLZaORdD3QpwB|0}f0X6m#}aXd(s+H=?@HC_IGT9cKak#JB4%srecKmN zw*RUMKYe?S&Kk+;A zpV&N#hX=#>{vT;?9TwHPz5#DhKtx19MUYYnk&^CE1f)}9XhFJU=oC>AMY_9th6aZY z>8=^Ndw@Y2h8e!)-e-Hw-vUF(p{ic7`AA>tn{ACn5pBZ1LQ6J5Is7qx*pX_dE3`uwp*5t^TWh) zhG-wza<=I6+7s1vB(fV!o`lgd{9=0aw!Kcm0Mr;Xm>3{vvT`ga+vhHL@BJZ-iRz() zONj0K{t8WaObWP?)v#nLTQxgZ!oFx)M&U7?kY9B48rkYKAk^3`MbMub3>9G_^F zD6+Y_I@@qz$_(S~TgbtHJ*((0<8wHS&T+BbiC8?$xVR}QIhsr z(4uJSfi6jVlH9x-Ti&KtnQV*h!jjI-scb_NfXjO~$UJ8?u452IeRyaTEMT_xkqVRL zGMz!V)!-+`CPFS3#bPtSj>{#T}mq4dX)h(1+XdDI2-2gSdFpW~uk7@79EYH7R6Y z`CDFUuioPDL~YUto8<5xskGs`2VQBJMxCcl`#+28!im-cd|f0CFqf9}Q!9O(f;5HZ z22itZF5}t6NzSg%m_Xz4(AvlKh({su4lz?-QkkQBbhkG3cFkMQBG=Pk)P6!xN)LQN zVDb4(g7Ql2ENUxm`_+u(@L-a$tHSxnc7Bj&FUA$xL!xWN(o&N6ngqk?Ik=D*M#)n3 zvJbQNKhEg%vt*mYP_DS$-?IUjBk8IbQ5N3FF?FWtprdsPo$&S$rE2ayI9J7&{RngI5l1Z&CXWBwjQs-vLqlcx4Bqc4F^ew0_I_VZ-N$HDSQ> zMVBo-fgqmmOtJYWzWwH_BF&mi_;T*%7pK}}LfqtQ!@s$9Bd*J#06R?ae*1+E@8S)2iA7LaV4MCbyTauhg-utImmb(GEv@UUxg+P0z%u?Y-xd2y5Jq>0>AILw3_- z{l6s)|H(3bdnP|p+qoZJGgtumb7<1sILO!J^F4WuKrk)Bdke2j&HhH&S6EhbnVf!X z34309)@`%5vb3Ok16A1}!L@BN`;lyqH*y%)^Ume^3tomNCnUjVEi3N07M1ujYag!h zLO$$NFHj=6K^%jpS^!m-dxiVmCb>38QDXDE?81V5aw-i5s_CcIeHPV-R6D=IVxoLM zu3wH0#k8+yEZh+x|H#i`*6Jok{!x%)~z)tiPtZ2qq5{yY9k2-H`0@gpqW z=tDBRZO&D=*6BwMNRcl4HG$6DAptU*u6WFUz4j^7&R0Lt()Bq5LE}RlLHlo4;*@cw z*Bk=h{%yx2nTzw&bY^&b2rS-7Jr5O;$PE&l2~Ze5&;i`dXgB z+9Mh{jodeN^}K^e!+m%y=xsbDi?E(c2&81@Eu-vNN4ps1m8PbV8xCapO1;*L`HV`b zK(p!YS6Bru;M!BT`wg87r@W3(U>qmsaqrRLg0CZ{FC{HP$WaaBGHFw=)c+#DQaLT9uazcR#+UK83jTjb z&Mye-a877E&i!t*7JJx#QcXARJJcxA01T-oU3I12E3#zpeV1$^TAQwT`tlb=q^e*2 zi})WWyd3BEK1huPYe(8+WwYiuT%&2QZs#3s9C$`T=H2{k`>X{#N+ z*=x{#!=v09r0R!sk83MOwBwg!#UatAWjhJx&bv2Q06KL@D5TutTUM(3Hhr>pRD9%= zJZ)z88tW@NhVEq&yarVh>W7>({qIQUujuj3^uNPV{$%;n|NWPfdqi;w=;NoTzmjt<1fAbD?uf} zi6g6+d$>~{vqS=E?@3&wAJ8A&P*%$R(#ar>(-CikX1odKpi({Zz%Hci?7h$G(( zjQAa=^A6HWa&GY~Iwig2SG~D+*Ot(^oJM;>`1GbBsy20bs>V`p}-V;*LW zs~jz|s*^+(sXISpybG7_)^TI&>?F0!@%F8dqI|V!q{`H%pRPNB|5-%v5H8iPox{TF zqp^%;z*~T++|wiJW(2-}UFZD$%sxi7*I!{|dHplL;Oiz?aY(bh(uja_SozX)j=9Bv zY%Y=>v4t?L2Eqo4g$121yiL#wS!hB`$e$bvM5yf%lS8}(-Y8w6aO_K8cGR2H3k;(N z%Jd8!zWwXnAAQ3?d35V8MH`;URoab%8asougT)%&UOTh1UZ&~Vb_QbaElr6TL3QAs zXNoL#DAk2y$qW=GxnTBwk#7qUvtFKE-Z(HY5LqwAZujClyzbAswI^RJ^*Z1zU4)sp zlBRoPWmjsha2P!7d|EfPH(=uEHo10GLR&SoU6Z6W;z^=x$)%;^2FyqOKmc)2b?hvP>qdOCSI{rbOaQh#{1U+mML zmmieoGL*Jc*A_?!{77-n4D;DIB?7yr3};whad!V~>QY|-y_>xGKrWWDJ3K*5Tt3{glk*dE1W?>vmwXmd!FLNx65+MYD%xOOk(|Su7p0ci z=q`k@g3Pkpjc2A{2t`|bM?vc;g4#-Wo=N4W{h*X#j{>-`nsb$yQfsrd>~cds(wVSe zQ9pTrXbZFZ_A-CHhRO4LueO&-k{9oOe!l5hYugXL+syGKS%vICuLCUP^iw6rU)!nC zl&qL`=(kyzv6VPPqXZ?@shqy|@Ht>mhCy4z*J`^b(=!rprhO=A=3PStouz!39f=5}>$y11*} z7ZvAOmWSHZfwuUn3Ye;rp>H{BvatGuS%1Wao8J2fS=nnu&uqRZFT~sMWOJCthm0^E z&eey*sH2~a?k-KZ=8HlNYxGD1tte<{-~#uD#2?WY1naPkj=pl=dTHK0prVGydv|{z zRG4P?(Ln`)rCnhJjQdU&FX!C0z9uKFL0J5C;ASWDY z)jYjzl%C9-_f_go0w4RDL94;C-3)f{j;+)O?j>m5q^2`8b>-R*uiGd z%Q9QLg3SBs5yy1Bt2BnD{B4j4Ifu^dZEjx8ZHLzV?89dq%ntVY(FWmSid&uAPSXC< z%Ho)yDR6(CW1k?0a#1E{1+KJoxH=jKR!u-s4AlG(Iqx>HaD+EuCg}yI?hhgEf0_sm zpXS&ccnZ4*UhR)bQWmA@Jb{S%*3mD#d+SJ+PkclhJq9R7>n8;~?%T~1cJCL)WG#8tOeoLuQpI7? z+u-2Xw5H2*M2X;m+#m<%OH13&TR|zU9$KjSd5K+rF!H zbe?twg01YE<{qMpNdo*40|plhJp!GotS3p=KozFd{T8A_SBe;9CbSBV_b_4XC-@K- zLf;#$;R*a!qEu4F8duSDVrbOI+>Z=|?3Fuu4>W^Le%~z;xBxTLy`b^r7h#~laRL1Z z8yyeIS&95ja(foR;<4poOB|7D>fycUP;r?K7}4~8-`RJuJ|?j`wM0iL zp-NjRzD$CZLipe9+(urPpdS6tcN2*CJHZM3!gp>(-#`p)-`s(5<}r_RmwDRkP1P|6 z>>E86u0e!@HpDGLov0cRAouE)2&ZU%)CqZV%#i`c0Jd4$y;LN25W{8Omly=2q9MR3 z(N+LT)G{FuMUZ*9oQZmdjn9hUc%7#!d_CmG=~4$s79ZyX*R0PbO1bvLYkg|D9&a_C z;?vE@bw0#UDf&IShG9^kY*RqS>h*iK3aVit`QVdA^wO5ScUkSKC@Sjn9a`wv^3`kC zy7XPoH2Z4iyxbS^a&S;WX&P144QRW_BpSqf8&>WtsIxoD2pfC25^p*EGD@e+tn*`p za_>julr!mtDb`y;KfA^M>RkVm!<8^P!{u9xMt!oFd_gu96(PW{6+UI_K^@&w0sD$% z=6kgrR~<6VeoG3*`G(H-*5e?ryOqes1JD-wWd__E6i^N-S$bbkVNf_4ezpFIHA5FC z%<_(#Bh*ubk89Ya)ky2<%ZPj7ev*8`~#iX z){jh;u|3v--pko8?y4Lp7YMnuQ(Oh*su$!?jO01&*+r=+vX?b&rK`pz?^d6byy%hn z{i8mlyFN-B_|U=X?XMvnqm9e-JUX3;r_wnq)eq4Y=TJW%!OTu)NafK1EF@k9AqcO> z&Ua!xRbkK|vF}FGPd}h$DMmLX{7$9#eITL%4qt=X*d}N+Bz0>Me5W?w|9tF6oWQ3~ z#P(qQUBWY`F0zafeGI4T#xk%44Q$5Y0{N8?}@DjWZ>~&>VMQPd9ULZ0Gq)&lc^?%v|xms43wscoOpN(oE7i}O> ztj{T@!cEUD8Tcty$0nT`?5({~0w`d-!6E3VO{2m&34|K7k`+OX07L1}VsWhR5aFG> zQMqUCXDU@6zK3@p3`!vYQCPmklkNy;{bkPVnt=})l#WLm$csvhe-`ITL&c}fX)MJ2jIIIvD%z5nq7U-OGsU~l!+Msk=O!4Dig<7$-K%R$C|R)C-+!}_gx%rnbP<51XTjN==d5cHy)#nskox+#XeFJi{S^k$*sxeW z-bB>hx}LaHnfc)TQeaBmtE#Y)quZaFTjn#2jO4#sWtEl5V-L$xB2o;Gz$a6y;!MDl zM>zFde>kqeK|ae;1})}8p`Lpr*`hk_xul}oo%$H?@*py^0aa`>UXr!s?Z{TB^cC!E z-E6>r*S_zu5Xl48R3S6*Z#}9w9HK2P^C%2e84H|OVPPuN*4w+z3#og~Xo#NR-R-r< z)hnu-a;U|pWbqua)NNt8%+5c+6RirNN^?Cbc;%n-Hp0qk_R3 zgc|jb&lk%KA#>*zFJd^wjb&Um_ee5CP>$kH=qyYDxiYLRkTUBcmb?5FoOX#P`rm

(cOgAl!$~1cI!B1CTpDOgR)iGx_bCuQ|QoF*>HY+&=v~+Qbv+bH)bE7-@5B5vJ-HA2NSH*Q-;wJj* z3(k|{c5%iSJ;y+=c|yZT^ma|diyWIyFvpj*C*%7)!|`i;=!8~pe5dcF?DA1ZGq(XQ zI)l`Heu{Zi*SG#HL=Ki)VI2}xFk^X?`)R}~_m*PwWL{CyEoVQ*URzdf<|49K@&69O z-|zY@;MN+Zv--SrXX!#O_v{{;@&06SF9)#?((eNx^XCct6m<-UkCQqZTdSg-h&07~!J1fs}PmtK&i>{W5Px z9CHcs0<6JEj$n+sbCOpldeqR)Qx4vjc%P|X|3UkjNn$38`i6CH>%TTl<5vP69-a>J z`h6)yH`gcuf;+>sgo_NbESpn9-9y6_Of}qES|0CaJH~`%sC?~K_)eIF@1F#y-<>AF zRgyRC9~db1S{0s+x??{@mxA3l>~1ADq!N*uFu9!QzCy8^M(q8F2g#2(uj)x?(5|%i zo>({h;`VO;;IL!9B}q+}n}vt}qkkWiJx<&=d2`10NZ};wV}s}M?ecqM&#o=kyLy;@ zRZg6oog^RkX~m7QWp{LU zir0cNL)bGneJ-ttWf$U*jyG;m<-3&eE@}U6$NN7jt{(>J&xacEWKLT26ZpPRL>Xa_ zIxr{#UwYi6yhJrRE8vRad(Uua@!J^HNJp|&pQp;r4QUXd+aNPQ%evQl(frjn{`Gw= z%Q`J<^;hzHeFjMDrs)%Kmuxyu~f2WPW!`O!DVpxvYo&kd}z2#Xk^Zn3jr#qiiYLR4^Q(c#W#Gyyv&9dsz=B-GTYbb}y!}223z$gf@b7YvWZw@MpJiLN0RfpM%M- z2fk)_2w71;#XLY<1D}ZI?tT*>9&w7`Z<28|FHs@s8p@9fIob`iWyh z^>RC}iKF9`yPMw;UPKS~Fch2ha_){6VGRiwbEgj$T-?{NlUbEeB~7RS(?$P_yF-M! zFWtuKR-KGGl-c81%<{ZH-D2wk2J&cW8CnUz?}lm_Sv+ukF_Ev$T4yHVd-yD_7AI%J zGiP*W#sIdO?78fRPZQ~hs?*}L^>|nsQICO7E=}$AN32%bjmE}n_|PkR=wVJq8 zYRYPpd;Tne?^W(+Y7HZT7(w%@$825Akl3GQNHjjZti3SR5Mr_DOqnBPy?XoG!zclSotSWLg>4XK zk7&|;{PSm%=`Xq#Z|1zvZW#TEFYUq)<_E)%>WkhwXRw_VUpoxpOY10Ucg9YZgBIEW z?QWi^5C~?QhcMj1azIog4Xs19ta;0Jh(0aLh-*nwWgNuqN-E}GKJ>OGfM_Y?mpw$8 zZeFA-l6x+H1zQ9v8l{v{vnC>YSR4ITfU&jdmgpy9%Q~rox;Bk;?S;dOAaki3Qw9k| zfpqYfBwvfKuN=-wwf$*Z1r%sQR+|O%@O1yV9|4$3SXC z9342<{V1yJ%wpCb4eZ$!jRE4j#^c8W((Y?%0cTe|E`&9Uv9%>dB`4Tj!oiInZy6Wm zn_lk~jl2nIv|Ok6vwJAiA~?*Dv__Ex+e7g;|;GhTWU*poFhnIgPy0sneW82kMM1;dxl=daFU z>d2Ze-ZCMHf%G`Z*Q>gVT=_7Xy~#b56Sn}p~DnQibfo6Tb1V|0TF4y$-5mYl%H zJ0yA`nfCwlbj>#$MsF0s<%ea)%#2Ph`EcUto|pCIHpK}T+bymO z;n0sT0h@PlGCgODjOn-7c$GnC+kN5M&zR(GgH-AQk*&?l*`^8jsr+1`(|++f?-u`T zOZ|+Kr;KpIYiY843mL(#U|E~QMGheZn6J+~`}7$y3p9D3Zmd>JNY}v*njGPdiYpjR zF|q^Fbgi}U6oiMaByZ94_SWL+b=Ud2ul7%LncUROYhd)6tJfO=-Iyvg6zfRKg`w^%;afbfC{!?kxmXvW_zZRW~O zZ^g{V!CxB^{n#H|r?|x~x=32MvAHjw{}4hqUHcyR`gm%j5B9Z}k}`?(D=R7g(=B`< zAJfvgD-W*HuFzE|3_^~#=U*gMpCUHp_(5VMxczc-AH<#PChn9PEi!u0#T*a=OHD2nf%SV#bSyI~2K~{j;S~;V{BNjh-lSlo2dF zN?MiV2Y*I**JDMSE}hxAa#xKnD?30b?4RsSTpi>|?UFG5)17;mwvJC(|8CO&$)GLeTAkV7It-bDTI zw7dH6*EbXf)_Z}8_tlyO)bEZ+g>PU|TJ&Nu+z`}>cvL%gZK3GamA=miSn$Y(@*n7L zLSjz}sFxXN8RskJE`o%w60}*TQ7ic~|J3aAmyc?^cHs?pOU3lszam~gJXiG>383jZ zR){Xo`GbkGEo4b6Qr18xZv-D1uUl7?R*gGhcleho6Crz0_#mdg%3PP1mr<#0e~rzg z;+n$t%HHV3Wa>DBzt>M<_4?XiMnI2;P4wC93AvoCY+!eU6{eRHqD$p3Z2bVbcqRhV zKWZU%JQQ5*a&HjOvV$#~$to!wnrg>vMbr&qDk_Xg21{Q~R=Rx4D=f6&>$> zPOYqLTW7@;u6)*ym1Gb~3s^#RMa6!}Z1b5X3G)zteD45NL!!z_dW(d?d7ea#WnN94 zoN<)bSuLxgv|9RMez~Tmd=?%|Qwz~0zo#XyXH)+5sf^C3O?&GaignS1fq_%Wx{$u@ zt-PuJyOH&Y7d6BdBJ6jdxNxXGi|^UuR;gJpB_hdYVsA9YuygE{NtO_!^v6%163&zF z7h+c(kZyYI{i~m@wTfy0!@YM9}Bmq=-+Z7q?>8z+dx(S>Pz8 zdS`2fb*8(1r39^jUj;XIu4!d&|Sia|{D5}a<&hqPlr4?K_s;*&b6- zkf;`Kf(_eh`^TkgBXz}kTCJP#%Uy1h1|gmZC*rC9l0Kk&{hAu*(&|K72i0$%c}|T^ z?IPX~&rb75be2*J;T4u{$o1*k($h!!WVy)PDBiw{e4xIT@5kAvvRsMX`6eYeuBjLt zY#du}ZeKklM2@-kHYA4>F=)<+#2Z9Ts7a2^np@|O7-y8=XM;r^6lZ_7zsl^HI8M|-8Ru3=_ z92zq8G1FEQkBnYtn(xOXQtgRppR2Pg_(vo}W5h4C?0>VaZnr@QO6v$8qFm0tPR$NE zncCPCo^5m$n075m#`Bf^&&Nr=Eq%RsG2G7}V~^Mr&*LW5_aWUsEXEXpSD|okt1*=0 z5X@hFB1YC_S>Ik;?G9cP^?d^tC1~X}4#(agd$tZ8yP02QKpeicEn&OK?TZj9|11VH zP9PP{Y0-UyuZF#-CLPCACwBC@+y0p4_lqd1+~bT{J7YZirf?^OTVr)2jkmu|P|`C0 zp?*&*NO5jQ6y#~S6~rK|ym0}7Z&9aLP}FcVUq^q8VmRIDtO1?BD!A?gFIIO-GfQthO2AjR?NE;!Pr8FT&@jX zwx!nme&#d}`Izos9-H^Me^<^m8pZ%3O2)+@{AZa7#px?$4u7s~Y6fAfFGm`%C(Lme zAAIY~NgmjlGL+ScBj|V5+$g%gyJmH7Yoyu`d8=JjZ`*Q8wPDZ=!C9PSudb$M+Osw| zRG_7tmk*5|EkJZcv+33fZETBrE}bInBN2walH2u2rOu9y9V;)bHIWzl^s>ldLllc#`kBFE=7E@apkiGUfnm)2}uvJol*Eu6KJNx@% zT0%th;OEB~6?pCaEvNR{*01_sY59^OP(|myElKZF`ppa_Ya+_zl$B$UMK!8DZ2wLR z{(mMF{te5Yep&-KzsEI0tBU(K_#UrP6pcQAZR?4@YBy@KYPD4`8uJ29lQsI*UWmoz zcAPt=&cZRXZ*Y1X$J=7Ez(h~fKulrPvBR^v{gU^DYH+CusrYK_@~WG1z-$rq*3~}V z_N2mti)DkdpJ4I(%#gAQtQ7J&NO8c%oHd3wF|ueLRvUBaT&F}b#zFRajIp`H_5;z7 ztB?e5ffQMxHfSm`#!En~2$y!ihK6(#@uoMY#pyRd8U;vXQb#<($Em;aR7#2$Zz(=h zPlneRc4_`Jzf0h!y$IO9z03Pb>x|hnYfF(=cr{#W@Yd`&cz9>83|CZs+Re&LZ|=Mt z53G$J^sb7E<~=Y1T56S!cT=&G>R|v81v|d^)#xv|Yf!&Nogem@=CVSvhz=IBAK}=` zi;z=Q4MUO;`FVYYd1>~q9K~OAf#tlC!ALJoXZ!mXC&f=F_6aOr72GPP;Bx7?ZAsBw zXEAv1WHH4qW^1y_v!c57Q%r{}Q_8)D`V}kKZWqhfvpbKn4CwCNd!i(cc69fE>jUGX zCxaM7EMFJumdGtEE-JGxLPSk>4w7)W;5jmJo7l-jQ!{$X zb#`_sEr2Er+$Si{4qGB!pA{D!=)N4dXggl|e7knfPUnk*@c;tYRrhFpcG46Qd4K_$ z8826%N!5&d+vaj*Zh8e-V)bH$#=ero1!apE+jB8%Jef*6?bt-OX4&0O;Qqx`4S#z6 z-yZ4TGT=Yo7)ZNBMH_u}KmCr_XNt8JN0FbO@s3*KTZ@UCS3JM;Ewg^$Rh^V^gF&;W zwRq|l%{*b-!o9sdt~D>5SG6IAHEX6ZVGT_%7f4Iu$~_1#dmo~2U$8BW8e5T6FV zIu!r1MXz3|q!Hm~5X{}b`UEmvOSK9`->oj=#$OfcoBpC-bYK7hLSmqTqO=Ji9@9_a ze<8Z=>syh8KhQ=u_hxKn%&%2iUSL`mQ9gZyaH4G!xD#IRnO1mmQ2I_0t^uK~h}78c zKBwur1?F>ZlQwSqCKpavSXg*u_vMh!Y zjP?$yOuu;Itm{4qtY(r{>X&pqF`b6C{K3;2Sl~sj<$WGEb~RfsZQ21;E0QLyIsCnt|%U&t99Cdl&=+HPa<((7^rha&Wje z>vD*{vJemeyXrq<_rD|ir@Ip7q>t{#AB{OZVf5O*%LM*BT179YiSz{GIT&fS|p*~}MDTL(~UoGaIL#c}+7J7FSC&q(;7xe^!%6g=)cTtM2 z^!-7NcuSeE+P%(4(?8~%RjR9eXb15f28KthT8gS#2f_Q)6x{6I!L4gW?#{@+K^v$Q zgdm0u#LTt^F)x$K%Py_f=dUiv-xm3f-K}pEFO+`XeSh+v9rf39dg2!-whbD+NbHAG z_3BL#b>yDE$gEA0wOiyI*)((X8dc9EofSW9yATalG&?2OB)pdWK2Lo>2lrt?!E$$D zN+Bh5T_@u-vwNherSST6(6*>B(h~e{5tV@BkN2_*S=1kGT~wzO?ep#39##{Zd?3zZ z*YBP)U`d^C98%|T5YB52?;6Pq=*S@?=ff)rzRjrzg{@e{`RsOT7Uwe+Y)@7dogG#o zI_r*R5N1dFZ=ZEO`&fD!S3AQX+-17h_Svxsm%Ixo!(;G8>rR5p-9xX<++|{t5yLp8 zu^QAq)hz6YK0C8N6U*>M9|q>t-ynmYHC`kJrKOptct#r*Tcin8{qBRN>e`Y^kw>>H!Vjx3XKwp9YPZ~KYf zD(5^5dqWtmLE@GyL`_!@bezNRc~MPSzuY4iw$>s8MgpGgc?EFrLMKUppcuL zCkryS5S2&Df)>kN_8lvd8<8M#w^#Q7F0qa2A8#p@yHh1JNixT`7k``szkDayGpNtF z{^{4+84

(RDgy;i^GY7T;mbM6b0U;!VLS-qvrs_4-pF2H^i;R)^TO*->3xJxeBp zCOkCM$eYBVAQr% z3MkcgGV%i{KGIF7>CIQ>IMEoY$pT%dR>vob;KblPd;6YJ^>1G02c-`U4^K}^>+k4^ zBkqh)#^@@9TF9_+a&mInZEEYlcCCpDrcINY+i8981yK9Mj=+IKfMN_-WoVrvmCxUM zE``ZhIM_`-#LtxGciAALHP&agst?RjI=_0_RO_zKC4fjoPgGd9irh-^DwU`|_tDQ# zeP9b1-A*!P5oTqvlSqYFhtx!m4Q4Ly(@xFH;0KV13a6`nZzE~K#hijR*&v~~v!Y6$d53R?Xc72s4Gga4&#@bk)?o~tY(pO=HuQXFO;PsV|Ft)rWjxjXwfSH<^y&r*< z-2TnV{E%3Guh~DJ$S-6#mHJXo>vLMGx{mj-UUHY0R=x0v@=Ff|Twf0RpBCG`0VhSZ zB=VjP@bw39vH>Y>o1I1Mq)!mh%D{!kB3}qfiA+n-Zqqohr0Dn)0S1(Tfj=y_=-hbb5ad0q()$Vu2uOb_bh)t)a1`a(pOCt)2NcDwEh6SnXMaJH0fdJ|KP}S?oU>_mWx9& zKhITd@5}PkRc=M4b8V(9Bl!yQ$MC0G(g*D9(G64XF|iI!Djf5t=9L%QLt;?%x@^3> zyri_W968AzAI}!ZS3BHns|uDZp3Tq8P_4UEcUqQk2?*wwgsdobZGJ{mqK*LZ+b?c7 z=GIVV8yOSRoi6q1d)&#i=?yNWoX$v|5~rSjD3em+gPcSzeI)ZxhRl(Yvrl4>FOIP5 zcI46Qxx_{Asy0dn+k2}zqu1P|PYlfpJDf0-PZ7i7hU1^ID$_2he~VF@j$e|KBb;A*0Yi- zPrTvYy+iz(fW8eK0-QsFrKP23c6Ly2GA=TlyNo*yR*D}WAC`YZ*MIWJ5?bV6ps)M0 z+)t@uIZfUVqpJ6uL@-lVsB%3UUQK3ryFiC5nacY|dOrUA+kAwv9G}MXc&FaGpF_cC z^_?P|)wb*cd&}~9*3NqT5H!bAxUg;H`8pOnv9@SeMS#VW%Ho&VfzQSmZR>5!kg1RB zui9{CtD#U0DmATr?2bp&qW#>p0tj*ISz+K@qI~Oj+dD_@b5?e)TZ|&7bgtC3V_I3> z8Fg#3qcztwUt5BD(amWf8Ow@AZ?zoDm{Kis>NMv7{IWfRdkejuvgz?2du6$h0Hbi1 z<7$Y~g^85Zc1~ZsM^)HpduN=znrF%%PnKZ>ct=Ns%nF(xPfn_J3OL>&aEfpZllg;w z9(oIa`7)88(aYTT@7mT~x1S&HhR7x9zAdv>r&DOq=i=pk-tb3x$k*1^it&_dzwUP@ z7r&)30oiRbri{~lYv+7MfKIQ$@zGx`#pAG2v!z>jIxD0a{GIG$PR#NBMJdbP+n zUeXd_9f*^`-R9|-R~!34+Hth0NOr;%AAxM2sE)2B#bbFh$XXV7M5?+9bunmD+;Tz zSFb%0+$@$nIA}8W5<+BbjgQ~BaigQwowf_e`*Q#Wx$23$=pBkP0|J6?;qaO&`W$+s zx#0^2E+ILE>+ZJt7_?^6h~;f}2(|$#_Mu{at59&Rn&#n;=n$Lqao6ymsag2gs& zvuMwVK!2#!UtIkE^)mI-mCeCDzWGFT8-epzY%8}RM+t^{Q|bN*HNXsAd;cq1Yqx>e zEYsRCM?&HHAJdihS)C0c1ihzunm+4`@*u{tj<2k(e(@4-M+;5$Eyk~g5VW&?bLP~y znPL<*R8O%Lu-}^!ep)~<#5-DRj)y$S4X}G2Ua>3(ajlpbuJt<#_Xsf(bJ=c)%{W;c zojK}3H%)>#isvO3orCK^VA0s_TAwqbUfuwm%u&REo&llsqc13vw0%%6V($D`@X}o; z#i_@(s6As%mb#?b=rw2?LL*w(I29Wk+enj`@oRa^z+>ES9u3#b_Zz`Zl=-?)ziJ}m z>USQxnHOppO|_~BMz>Ol1-hkEBM3LgbRVF+s)q7Q!c-mSUSEw%(< zJfa2c@vnd7I?n~N%R-hzPl<@Ul(2g#tC_jE&lnXG9}J$NvI;aI;ao%`MAGZSIU)O_ zr8N0lHX(vU*T@JSaTG~97ma6@VMIKlqfX! z!v_hDz{MZ?W9#1a0$s^yclU3;9Not1*P_&wL`$)?;tZa#U7uUr!!wm-#P2MAs0I~O74lD9tEyt7NQ1 zHIdAqi+fVU9;xqN%#`(@cU)xrBXnovH&ovo7?4_}!K4>WAS*BSW>$hzmQAV86Y;@g zB#GAS?!LYLCa{fW>okM+KuE#-@_z^^@c6-J_3o5sIn1e$eHbtz++*loAxz0gPk&IIh=Y`Vx}=F)6t+QnLqp_2y8lM?`PK^9%zx0 z-(Dbwo*z1q)!Pe3VTiyuR>^k12@S5*xR*l}@jDSK)p54Wb70;q+aoAt!r1?pQK z7#kaJxj@;NpalgH%Pdp)tB0TMG2i@~uYg6zu;D{ZSUrm=@v|LC^$|n& z7lLgMwkEaS6Ww8z4J0Tn`tq#OcKRVqP`7YnLqT3nZmHfA75>uD+ZcC^k$yxxK>r{| zbRYNOf#}v=Ke>)E?0cv}PF`NpZZI$~kjtWjPIf)|-c8=9Qf}X>NKLJ0hue*Y!@601 zD}*s#cB5F#(DIuy-@C&h;<7#F_HR@Td@+i!t;)%){4PE4Y;9}`ExvLh-M8hJrRIBP z<8g~;r(?z@?L4$&OEV?yG$!w+q1q*-B?l@P3LtRU5+1&QM*Y#V8rjpYqwafbTvrRE zXLb)KQ6JqyzGY8&qP!`Sg{8Q-xN0e+4gc3@MQR4Y2(D$5Urp-WXG|SGoANbNobCg! z-SWfY`P#M(subQHvbDLXI*+LXkPI)??BpHrU?PmJy4pAufV{jD)SGDU1T5KTSZ7d- zgWbGVe6SBQI(l_N>aM)(jjWOis2fpHe0_8mq>S+J(#cu{`A!LO| z;avP7ip4H*Degs97zh!efYRzC@_xjZxNfgk+2X!p4hoohyBk8=#}3`rX*8b^Z-|v? z-v4T(UrV5`#QNr@(GAF@eh-@^Co37*u~1O{>fkQdOL*tn84`_dOYVhX(abQA4 z2=VYV^hmMM&RAy+H?dsk0`PmO>X##*Kkp(>;L{#W9B3S&d4c0Z+;y83NDa#=&^N?y z-yr5;`l~Wpg8b$qKmQ0OTANW}RIOzFsa2fU{$TqqKqQ`>?_&Yh{RcDa!*Eo?`Ao+3 z>7^x83Qn&tHj|b5E}LU_aZhlgZ4?xOg6{Au`C#`lUQU!-a%o21IBC*DMiE9n8TZnw=ToQ3bKhE}QwQg)&rgOR%#pLx1?t3~Ay;Sep%D?_ z^}{pwg>F)paYK*ZEkBR2{`3n#YNBrxDe88`+S#_2oY~Nk2*Bv{i51Px#SC~hu zJd*=f`5NaovFI24z?!P}h@e*YblsH!%Ngwi{!xjw4S79C&VfcrNz2>kl=e^aRz)}8 zxq5OIgb*RT3(qLX4O2O31VG!uKHD37pOJEiq!ni z(CRmL^u-YSC5tr$B2uK_q_R8U2CjmcnOT<@zSiGQPLrg#_v|aI4SuRu%_J=^6J*C} ziw7SwL8W%u1GPClXMo_ies@Cc6H9J$g>BLckoD$U!XZ977%njt8vt3LM<)G$v`AyW zqE)-HbDb~^(L0C~aj3;|D{DR-N8B12@zT9Iw3WhE?CZ@gFMp+=pioS!;0pRUnJ`n9 z5gQ+`+gbjV>m~EzI%y&|s7W1aufb;DXw6jLjGjl=kyIDPt5ayeMP! zKAzK6k#?QmUmh@xVeU-_qx%LMQPgR65`>dr?as(Ypp8v*ON;2?L{?4k62DmK$!)l0 zg5gsNL$|N}DMw#LFZOvVy$+Id4O1NeA?_aBvU7cvhLxwGxBZ*oGC%%urqkcB>VNzQ zEt51nQ`vHH7x~UD7K5v*uueBA-`%Atg(9qKE+Z{+LKCLU|Wq+beG;+<5JX^$6 zGMCZjn&2Olm6Z=z0NjmB;-RrMI4w17=opRfIQO(hxm0rRTZRv25AVySSStajAQn zlXoV3d z+>Xz4{9(``H}EOF_dKfBqU0uGCaWw+-1oF*D8LQztCjf8fEU#H67V-YRDzNtYSETk zO9PejNX>||si~I=@}J-OUO8!#k^L+&SqJ7Lc42|h!_a=x>iZf{lD<>qcQD57c{sTY zW7Em>_8$SK95CNYbF6x1;>ms_@>Bj|{KNUZ!Hv33B*(`Uv*NCTC%Eeh2r z`)!dQ#B$`b%b*>rVxe4sFZmq9=-M?DT{OP|6BI%ZRlCK{xf}1U7bsTdJ+j}_w%PLm zSce3_uT(4F{m3t;hMFjM@$& zHOO7pCraTVgHwnrp(#84a24q0+16q&D`yO)BTObzXh~2c?+phh_IKN-#WP^ivp{L{ zTLSVgWCF%!IGOaQ>*fsV&tQ8NGb4PvM_opr)=QSWHon~@cN6w&$9wQ8nO=n7A@&{3 zxZ=f{UKw4rm8x!&r8?#j-Slo-@ImGIWQgUOE`|J%X_lSwY7}U^=Zy1GHImBp%V_co zJN6qqxC)0J=G4$r$?E1eb8g3HN;n2b+HBye~U*evLvA{_c|GO-W@#WC(`yI}FT93jHyLIZP2 z(6|w>S^~Fo=eoPabnvXzi_>|h{QZk6!`AwxWh>PZ@6^<>uT$|qvr))gil#@i*%Clj zTU<#ez%Ub*LS98t-@VI}l#~>mYPZ}Hg?$h!_%}6qAkzU2lxz%M zBZ9v&RM)@vtN8pyT&ea|n;RI3y|%RC-h6Za)i3Dnh;56pT|9e)EIIwD9mYtLrpV%w zinDykKW>84Qatu;I`?b+8=1IMtKnuA8YT~Fk8GdIQG(qbj3X}OD|NAn)0^P%`_Xiv z&Rl8+v7901BV6xw)7frHONIr zM=#C>vNUY;4IYwym`q_JUBpqNjHA`W_s!v;*ZW?ycB3(cnu{Y-Yf$v(wGzlUdP}4G zYKbFScW5wvq;fYGWrrGE8Q1Q--5cv$Uw=A{qSrm0wlCU;m+xfoCxK){R8~>!GQAK3 z_Kb@QVwZMh4~41xof;0mxeyxtuN7}boCxXoEs;wlBfhgFt8p{N{64k4wtM>!o7Ib{ zbv<=;2B3~(gbZJA~^f3A(E+d+eu`X#CpK6mzV2(g!8z&iF0 zJ=4VT*kTqtS1VzjMr4>Z8!lj%lnEwTz+(6vQ>ZZe?go9A=LRJdbJag~lUjdq%Kw_4 z!Gm3Et$z-|dslUhJYK~52W@Eh!V{8IIsdG`5BY}>cJV8e(Zj-`YRe}j#j#YZFM$-t z`1{plU>WZz>W5T8sfK zuMm@t%(SqufLh}ZqM(U_@*h6LMklXn5j>8(l@Qv}{37yv@v0}&$~ZpCs%5NDwfrGH zJ-x+#w<-5qNr}*~+cED@B222%5gt}$38-HC_JJ%1oW->g2DWi%iiv@`UXAXV9yCS1 z*!?2IyoGNf>MF^9pkWIp4Zs1Zo59_C-=g5FPSPIn!HPPq;;UmNvSx(}qB@YYY>%*b z${`7@Qi-d#x@k@NZ^ZXtKHCNL_Xe*Q-KHMYBcrkUZIV)Nf9&-7`kO~b_wLHS zeOpK6w!Ty8(%N-OZDKTLpWt_cXKEelbzmDB78V1ALix{bW=d=3oGo{h+D~#H1<6^$ z@P`(U@B`ky6ukNOeD43Ue4#D=Ry0J_kVk|WuWBJ?Z~iQe65xI}F|P{!rj4|7l`8U@ zo@1UXHrh+1)aGi@s|%pJk$)0aDk{Tx6lci_h`UTz%+D)Z?Nd!e&CM6!zciHXgfzqaD{1yE}!_N9#++ggZNhl$}b8zI)3z zDV5JC8i;Xx9l4C=Xh#FZdkz*G@V!*;%E?tLuDz)p5mh6C17hr7Ao|mP1ko>*tI@pK zR=mcM(`CjIK(PaysQi*Mwd0?5J%s#2RAl_uCNKT!#h-mZ1KTx2R;BS<<71Mj%u^GT z51}$ZY`=yzi0u+~Yq4p}Sf9@TGA<-qQg(BdC^}S+cqNA8^+QJ4KT>;G?Av47#(XzP zJDJ-RGWuttr$jXAv*>f`%5~iBQS6>Vo*W6)J|`|uILkgwOx#cKZJgX$$%;~RcCI*| zBd+!0>9q1F7+F|^Hg6vAvkR*XZiu{?K~?J> z*5T=~MMlKpYa6r485}}(Pk1|U#a%YS6lcB_2 z-kZo^ftSf92CfHDa1#U6Tpf3QMMhY2ZWdqEvTgi7pzYTkK-E8XXsBb#mm`+h2U*BxHEh0+2Ps~^N`!0KkRZ( zmV)|qt6-KCQJY5(1SOltuZ>1(jVKW0Kuw4F;_g=NfA(HDZlM0mc+pVYvKS$>w-BPN zU+lHeUNOR&sdDQfwJT38zQ)kt)Kl^(q34LQV}*|gTL}BOfK#1n&0jUqdu+!V>7Gky zd$9e{MMuy{r7K7)rHjjVscFAXsbxj)LTKY$2))GU_BTuVfBq<(`%N3Rj#X0N#{o%> zq*hT=nfaMPkz~FF5%i*Z5&lp1k*R^a;Q`zv0zn%4 znf4}r?EZx6lxHJp_WM=dwfJ9ailDwb`G#_p9_ik0!VT|SW5A`a2!L~OR6%Jr{B}=m z9F~ACP(q>xi<*a`*<%_(#=Q+j`~FpN0PJE&!^% zI|;2|?W0%H;9hIOq6fUzpBR~$gV)G(DgI$s+(-lJ9v^*$2?a5~)Gi7(vK!w>4YnsQ zMDDAr8NLtuC9=eVRh^7?*fvO2)ZFM3+HN~LP`4kz?JSv#c+Q(p@?!=I zsDOY(+rMy~ZdIVj9&WL?D~_Ipsu}9C%Xs%!e=G^ZA26&itEciio-6V2n%o7{BzoJ3 zCCq{tnVFb+s>hAy7jF+XWO(&H*}Xh-P1_npq*;zt3b#nLxn|{j$&_`Et!Xv_cbhbn zYP;6oP7rb5nkg~O)QygdW50X%E%aFy@HH zMm8;q#?BJKQ~g_U=*YM`e{Rry<}bHfP@@>tA-J2o;oINqN9 zhTFhYvADyjo^R^=Md3*EP64s_dW?O~WV7LB-Msrrmjrce_sgThnL$+C8Ibzu1IT_% zKz^soE3%>T+4VvZkB!Q;TEevSi?Wvn2B}ow<2yo@Q_o#~F3d&W*%Iv*kx3~#IU(Kc zQ+m2l#oRBfE;O;QR^XoVrMh|X{g1Bo$K`E3!F&e<>4x( zq_VQo8NF0IFye81T`lMO^rS>F$j+mNYr+3UDxW}2((-gN-$7JcUIs@jQ1mTyHh#tr z%v$>B>K-yCI^`lJ_^SjfOR5J>i@-K^xcL9#nf??v{zd^K>BT~HH3pVTa?ISu5)S#3 zqxyF9y6g3AIlZAB*HVIu`z_z2Dk8sL4m#JH(@QukpKu|@UXizhPGBSP+J#K~LZo=^~rAwwN~EV2913 zV!nIg0&S`{$!A1gV|tnQQb#S2b-DxEuePVc1tEDHAf=t%6YHwW=fL`nKb zW<*ER1EGV@j-7v_(CvThr(+HiDR9XCn*CUORjjrqKlYk!V(HydeVSs>ckrI#p)Q>y zdzTZCp@aoXdTPe8_03pox^@=q;B&X$8s>WrONx$<9pR%DRQw$U;??=%TcC_nAUd;)laA0+W9OdTB^98tqrR;mxc zvw{yqJ>TsMzHNNruIN5h%P6iF*}Neuv{`u-V+Dcatxv2?e_u7BhzPuy-8W$x$g9Jv zQuvX;(qoXnU^0$f#CQ`Q@!o`4d>k_y1>eok~xE$iEFC2y#eWvm2j$e5HRz5uR^Y+xkCxd-4 zjcFn|jG&lU!L-)e&hqkSla1pB83<>&w`6p58d!kG8?R9Y;k-=n?x4uz=woV?*U0F&J|i%vw9Rr%V+k?9;?f7MCnO z+H>uDy$QoOBng8H+dGAc4czxZWys7%!^%121>Ipf6^l2jwoO_&-D= z|6lf%+r8`LiOY^o4uv%LnePmtE45f2!yhiszi`LytC9OwSnod)d2KjA9Oial8UP$n zo;T~YSYzLTmb5|M`?>g{-ssR{93>juIhvq2iyFXeiHi&k7w44p)p~O79FbzC=Z#0; zRr6RN^4Nw-{IPvzWV1tZ^(3H`JyFnO@Xs&kuZ;DXf1r(*j_p%=I*0G+KK|U@O5T5j zGm_tU0(1Zmqb?1uu3=;5<;lyJRQj-an0YFRN|kCFt7-hzV&mmZ6EMi}3TSO4K$KM% z3XShOpeO^~h}SdddMcWY&VEcT3QGKb?`^Fwm6e6gFFob!8Qm4_8n-4sgh$4vlrALzto{~mXk;&Ey*Z>(&GfsK8n44ePZIWGwEWL$MZN^e6sV*%AfFA zXjsIE#9n?k%S;|n&l~U7Ji;&~v>Yeed2N|{E(V08Yki!c} zxU)X>q*_R#mq@u8Y~X8!vzQzTZH4NN$?KHh_wjX1ZLMHdtfnXd_Y>(ZCsEZRqhIBx z+^N4Oux}4ienX_%H(kFaFDsjy>N{AUPW087JV3LkIj)P^+u#>Kq5{M;7Ot*V=%4@SbwYa6o4 zt^c%fl~2Ko7qaqT%^dBnv(qZi5mqs2Zn-2--#^oj{~MDyBvc2mmuHaAVcy%S}C5Dd8niHFRByK zX+&e!Ht}z8mk8IOuW@bB{ZUZ-MiEe0c+pyacI#t~m6vKBJbPcs`9W%f-$j(xihY?; zQ);Ar(av0mRS(e4wF*V<4YfSR!3lD?x`4zymbmPPH+UqA?ruxF^mI`4p)dVfiVf;V zR(DeQk|iL@=|1IEhJLjrIu&Z^ey0yk7GiMJ^z||0K5xzo7gWu|WP;SH zPrN4!&Xf@aq1^mvH4Tb4^qv^xS~lH_TA6Zt->7+r$84*;_ds-B#DyNyiKh2yH@PZ2nfO!q9ErnKF6kK#tBARS{zmB zo-#&W^S&noIm_K;DiRv>3~4w{<2?(*zKbnoV)Wz2-U$nKjx8q0x@NDYwdSSkb6?Nz zA1QAzi@8);T&dzO7hNpnuw)NS$di%Um*Vd?r{?_!1}oo=>4hSWt^h!$ z^U>8cyE60pR9ZEcB6p{9v~Pop#aZsfmU&m2vlo1>q-MZ-F~QhxtQduzkOB1Qb313& zrwf)Zt|rWUqCs5HqN2$yCq5}XNSx94viabvqnQ-D!RpqK$h0*SzfZ@&*emB<8&mb0 zg#KTXO8=)&2v00v1D5Sr9ZCFsBEyqudDs#TUhL6IP<}2UpB8iT3JJjM3wo2#je-F+s3P%x^gQ-GG6sTAt zHWE@&x z_50PpVX)~@ZNBr9$z?UC#g2#9eG1C3Skd)H9uP$+DrmGduG{8GI{DGIi}FBM3pxC3 z58XWlU4g1H1Rfo(_r&NsoTT|&p3pl6d!ht{h4mt@P9AXYPCp<^j~=x{G4^4=j9bZ<9b1Q%a3p+BWmkJ`R3p)i2p?57OC&buEmE0UI~&7Yfvq8*rQQ98 zERITQF&*p_SDw;4Jg`tkh!VQiP;Cju+ti+}Ug_10Z8=|F0gY^)7KnLn>mMe|kF4$Q z=v0^m82}`o=oF-1D>MSvwbJ=V`_ArYM%gDnv6L2~WcQN7uvj$u@Pki7<;GD^?!4$^ z!9AAx)I4x5K44(1kj+GLuWWhdNx4{2C%6>?hBsNW0iqC65p9`AG!y6pBW!RD57 zAXk@w$~N-)MX{QUXAqV50&hV``ZINJD zlq|Mzw4{oP$`3zTH%1o3lrs*s3i#3p?L71$?yuqs|3o;y;WbIQU!4P(AyMDkR{e={ z`wg3-k5naUu^7N*`2KiqC(nrmpZ>sIeEa9iO;WxYgLBbH{*+~M-$KKvoyG=a`cSzYRW z`r|St^1)JD-K+a9K^#AyP*RxrS(*AgN@zg}Ru8FPXvq!kd%9r)vZ`0l5CakHjS0MJ zZ=t4G#z&r`RU0ab)nWK^LlR<(RS6X?0rA^R5op-;Soylc!Q%J8>6%k?p6uQf}JT?$gTlM_unv7Ur8r z!09WL6yfMVtrQq@1B?M!(Fdrw&v@@)l6D%g;Tr;yK-r|g6!w4{s!fAW?0SmXeXq6_%>ew7Pc3Nq8J<8 zHx50C9C4YMnR;!s4d^d&X&6jN=gg#BaW(lo%JT6Ok~}V?-M1zxB&f6{T+GG6^T!Jj z)u`-&iXl>d5MpfNO$|m5cO{u<;8f=#xt4EmKG)HlhGo9wWZ}e1h6a zg|K{g?s~);C2^S#Fa|`#N>LG*<|`wPhV7sHd3=x@3BM_g2U7wv3Sr41oJT$P>GO;? zx2hBEIRc3ApbbE&Vne0>`a3p&fc%N(8qwcQ?D}ueTM0JapuNn`%79se1YY-bTETH5 znWaB1pf4DFCAhlL{rB+85b8Y-{zn2j5E^a@!b3Q$EqBjaIHLaB4+ByAu7v43Yoa!K zMNs!8GY_Xtua1W$)wyZIoA49mmt}^FnrSPd4a@}FqIqjOOA|i*>Tb>T{6nilZds^6)Mr0V<$N62XeDb?INqC_wU(qV52knP$Gp|O&P=SebvdFYFrWtzU*giCNw2E z%__5IRAo36&p47Beu7$Ya0dRo>4CA*(aug%98b2q67iF8yebr)3=cSo|E>~zuQ!jJ zoScC{E)seW7Abw=qf7Zui1;HNi|h02UpY1*pKd%Mj}bbTHZGRF8xjqYm)?`ryE9|8 z-Eay6I*)XhcmvO4E|=a!{D+lEbT;xmWU}Ahc#E_3M@Tjh0BMLGfHty#R=n5ES0>IX z;k{RcDoRSs{{3I9XXDFVg(s}69x!x5CqtB=l#%BNljjkt zc5%IG$QHaloJITz$c(in6zE5AUC$(z5LE+kLIEsOI+|z9_%Gn$EK~8LRLgwVvK-oAAOOXvBuf+1SwB zYK2lu=gGs!t;&*!W<-5;1+y#L#!sjn3Z}U<$TxoWTJKh((>ej)9k-?akayI{AVhqI zF)hW6Q`Gd)xlcks@f>)}<*bCFH#CnLz3X-kqd~Culc+5O?Y}wBar`$My*v8qc&*E5OzEPrdA-O>289R%#?U z!NH_zWoQrYN4cfX+a(vVD)UIG9wuz~d~X6@g6zdRZ>1~~EC8&N*7eJa&JE$b`bM!k zy{$031}WEp6Q8UxL*O~Jd56CKQb+!5=<5{>GdtHzUX3Ox8RWD+aw6L}jMr+Ab{!b@ zWWSH|M~e8rEC7ia)@QmJ>iGE(Ngy$Lo04BCGc)r%G3e{xHqmb%)A8D^^Izr$uO&}a zYG`OHI=l|B6R3V>>~ibKaf@SSS@XVDU;VEjD1hQ|>Enc)6hCO8kXLOTHeoMyJ|Fy6 z|7OON*ml^@55M1>gd6L|&3(t3_{_$p5s)ONg=G{`*K%n+lrFXlw&{ zHp+IFk&fi#smF`j#=4kiM-22z&_ami(I(2JjZmNu2(9MOFZ?2n&Ne(;P<)V2#Od|= zKN)QG2JSsFLQs%d{aXuwp{419ISGtb>OocJ>^yA}zR;s}?MT-=fFSH+_~9niN#c=* zTJ{Ho;D^sa2jG1k^W=R#{A$D{vpxGVFM;DE!bL?DVKFejE=XP66Aq50Fn+6|A~=_= z)!G+%VYuTy_kCz#DFwm;aMJ0(r&|68EynSh=qtt{G&rce19};*pko*@eV$U4Qw&uS zH!h#pI_O$kHbvMW*N;R45^1H-+C!9y%sDBL-BTw@ivGA8DiW%h`d2Y-it_Q{*H^hMN8SpZZcAIVm$&Yo$Pu)kp9>zBOQ$Ns3+>x( z9xWfXldCF}8Hp_dts@S6h|S;)WQ`}EB^VshxP6N2vM?&o4Yh)f+T!_IXh5}HfBd1e z_9w6Le~EZjX0bG3m#Wb82eW(Dex^_et^kEY*{By30)H#!l|IhUNLl`>A!^UzL*EQ! zOl+^ZrkQqXk)+HcHH(3I$18U4y6)8aWKiT_7ZNySNoD^d!mNSWjw>ojqCh64#e?Eh zo)%LfcNjQS$W4JIjM+R;pX!H+(MEeWKI-? z`ZiMFqkDP*Fk}k$TCx)g)#06k$bJOGIJDU~xB3(;=7Pamd;}XwpBU%QtaJdv^>76Vt67$|ffNKH#) zU(SGhU7xOpmp-{jwz^Q&b(s(n=zf=Q^`xMpOFeykF#_nf%7ZPlQm(aq2_7?^za$~GSbc;wxWtWj<5I6eY&}n!iGuFyYb%KaKmLPJ*{cd#v9)Gt6N{Gdlz8SPC+M^H-Pe0uOep? zeU%mFto@|r6VQ_PJ(*RY%Yb;p_vAb*j?DSEH9ComL+mu$TjDyypWOqk1vVLdCgYQ* z3egN%O!6R?*m@L1LiWl?LrtCi3{d59j6}HSGuY{ z4~7t-r&g=jB}@FTw^&}t>LH!yJ|i+x1~M|jsyD|Zj8pV6Lt`+*oGWI@|Kz3clKoFs z+@F0ssV4hNEFfI-4HtGUd2@LaF>i@fdh_mWRE_6gO)kL;r%kXu`}eks`Ra@$j4}1$ zQH_2h(OXGSa_tSnee`;!*pC6TrKK-I35uHU_v2A&Nn(35TgT2$*tZgH+5VMs5Q;rYDS>W&t#k07K`C81e>UnA# zYC8xPGyYD5?(iR+f@@gU@6iehe4E{HuA2awL3JdvV5N>Zq=LCdV<;ceQi^)FI-z$>x|^-9&>^rGGvHpQqF1CkPn4ti=X zkJ%Hdf3K7I5B%np_|28U5wUmT6wGShzuC}Sj2qY#X{dU;6W#et(&|iEA83h~_SxGi zcAClcm5maYL=8kR~P6GI`U-9wO&-cer~E~gwJ71NRFe+`>gsMezi8&vgQMU-7SbXvp)a%D9PIf zi9|$-i7t6O=p&!(l@%)a%rx?vAzX_lvq(VYbc4p+eUoMjR>pFXT2^q9szpOQzQ0yf z)*TL4Nyz57TwcDqaIBejM`q|Zy@{~QkK>Fli8VgIe0{QIT=w~W-HKLUSbkA_3(6zS z;H0Rf8^OMm%!gLcRq8r^3x|GgV|)XDh~Zm8CVjL!U+{gvH*bIsH_3a&#(Z0#E3jOT zoEEax1c|dp*7VU_Iu*UJ`4Gq1(ZAP8>DYU5Bw>PMmm;(@kb*w0s-$iCmS9uDmBC@e zk#O}>W0lA0!;tGUl0Vy2ELIXq(kHl#IlafR>D(OkdEqbDm_M6dUS0IO_br)8;Y8ov z_`C%$o+CQE54PNw1Rnp9R{e#*@+9??Qo~0j^rMtU3v1iR8swGUVjz3_3+tc*kCPOI zqh8?)o`a*aTNbEhpPnb2I~I?9|GaZWJ$O4rhtQrCj zU-==_=5j%8YT25Z#Er8+JDRG;^!fVzeYk6wmk#1LZ(JvFQpO53CA}#HE4Xv_&d=na%%>#RuK(+mg7@L^ zMh{DdEib>P8#hyS7iIOL!%$Z5PlYUg_+1GJiK#kgv6Hj26bChgh_LVqAV9S&P8m^? zmlySAdRjD#zby`E#8=bR6&f2Kr{sqh>+-AuSw4PS*POeg_~K{ldpd6`y5oAe3p>Wg zL;Sq9@E<;)v>q)rUR?lD7+-D?#MXM(y2KTpFXjqf#IuOWfWYTA(bgL?0?ef6mD+H3%RJ$GPo9D0@Ix%T~uy;YhoM_92DhjQD9k@p4| zb~JN#if7&+9KNc~0{14q43xrJd^pmqHNN(IITg%TT|>k{>mV%5OaJbp^hJIN>a-%a z0&1Wd7Mj_D?X3nfj6m5$!cP1?W(W>!3hH6!7Z+zwRxRt@^;)0c+V5r{9tIRNiXYZG zpuD`cTSKh(me^(IMa9HcYSD;S8X9*D-7ayUR^tv?8;IifH*tscx0;l>@Z}M=rHx6P zE{`M>auH$`h8gKvcIGItZ-t;wZvP@H>Sicb#kK`SU z0G}Haeh3R>%j_F8gH00h^)5d_$bHBA{W;!m#-{fCY;Yq-wF*_SnSsMRn}dkycl z2bPP2m;`g^(hKItX7!(&ms;Sj!_*14YLUl2rwzMUdfJAq%kW--aN8g`sy`ORf4y;f zfTgWnRO0-TTV1{BlT6q>n=6@&HBI6q|E#)^CY5~t6xT?1DWh!c-RCfrZ8MrDy5^Q5t0!Q6!$W(IzU>j!mg>6g$7PP6Z@)_q z5WgH;ev2?V_G5`6bv9uy4h-b5xKat4y-sD$bjEhq>_PA+0*C0yzT1=`E0qRH!tz;D zGz)buw{1rrH=F9zSHv#B5aq9P7CnRp>$TdySG05Mv`!Bk%TmQh@Qf?Aj}Z&hw#p#Y z>Pto4t^E8%;`SWhjE|Ia>d1NsZV|+jO8x6m{ADz9WKIYio5Azc_Rl_P$$iLz$5EfHcX?XKp@u8SF??ta>*M&wKwXJbbt^K@5|a+K+wag zs-xFZQdpjzp0AY$zBWgLE=~`4U6+)qPEsdzUcY|6oY69oBjXyRs;@6HAc0YsI$l(~ zL%A@Cn?wN~=@{qu%5r%?q8T6er1pKhwnFVD3s*1q74RIVl#vVE3~>GjjuXtG-cw!< zBB%k@T&|o}s4{1K5j3SpK11#&rjw=@oUbfl02W$b}CH z#$;xhGq#sk0s?oD9WpeO(XKP)HUw$l`I!A4^YK^y8LAmV?@z(-c~!KuwtvK1iatlw-7SxF_-&{? zC+X;?J7{{R>o&9tgGs(-85?!uV$oj1Y73V1diB^aQMhySnGE`VPbJRZ6mbD4KuX=m<`E}?=Z74rno9*2N*i(E^;?d!4TGC%;Uob?n*!WtL z=!VW^QrIT$WB1q{wHcz*V&1Muy!*F){ipxwWkMHFR-cje-u0@yoEZdLbX~r&9tnGV zKneO-m9-@;dMGB+nL-q|tkX`VYJxV04F?}gips93tMk?d%=v+EIk_CA7i`ca;7 zA9A?s+hG%X#TeQT8x+VG#aLF(-aNz~dd>>8jC?zBT#qW3Xq!2DLo#ih7qoj^G?`E- zH}#;XWlpVuFW5Yk4;pNR#!5frT$dBFIYkOO4k=GU*{_|wtMMUy^q)4@HSA*gYjXxg zPW38Qs;a7sveB29m!;}=o?idU=KYf?yLFxBUWZsx zOop6XhMJ7%k)wc-bkvL!sLZLjz@(V|F({zCxZW?i+_Aw(QoH70`jZBy7D(lrRwu|f z#yL$vfn%Wj@UTY93v-~oI)!nJ9%$>N_T6{(S^|Vg_I(8GCuOz8&N-UiB5^(@)~#B| zvV@E*jvFWqad=O*X;{8O7jS(hGzDLUl zYDZcfPMn)ZRagmjzWcY0`xlN(6UqAg7$rA5TOXo3J{3z}g)NBXh z{Ok{pjbi!ZIcE1(`80ESg$|m7^}MCb*#3p0!pOGw_L)znr3eZ3-P4AGM-z$7{_A$X z?%0XFe$JOOFm`bM616mUAMdX_Y?dDTh1=du+_6fdEK&My?`YWy%m4_+Tv?9l|7_0A+QH0270cam9u@^HW_6i z5ha#t$cpR@u%xN!bYiOrMr?1ecA>LUc`s@o#ZsKT3zTFa{B6L0opoTOI#S<|(JCwR zdf1|(qK_FE0^bD&8Wug%xbfF<{$W^VU9j)GMtyj!U@5>yI>v7P+K_aZy>x>V&OXeZ z5SH(tov=z$90<5BCCO5Sp|V1abBMmcV=VR6*IXg*-D1?9Obi(>7UTV96@S^PFZ=<( zIla+eok~~h-R9Ei!_-TSP)A-lKYyCRb~;mZX@4B2^E1f3(PK<5QZ-Unm*(OczC%JH zIWQphv-#|BW8Bd_w5z6uA9nncsUKdw_VBifvki`+TOYUA^4FrCtcEJpqitG8;gie` z=y~<{-LE>sm2p<^;t%YOKP2EyX0^e-2j)y+rDbG_=$X8dyyw_%5vLD2V|6YfB{cHf z)U%kGR5FCUmo6>@jE9q~(v*9ixDb|}A%PUC!jRZeqrTF9n4@2I7mxZX%ylUxZD^I? z&2V8{%kUw)NWX)CeYmnhc3O~U?f^%%Uu&_=XlbT(sZwbSPPQU{Sr$}Cu3^+5ClP_T z*I*lcRFNj)@x(#(3lQr)X>0ObKU+nHvNaO`i2mR3{nr~O@c?V|wNudUOJOb!Wj^P- z>~G>$XkLs*r7BQlhkqshShbq6i)D*hI}`eJub!0rFV>Wej$~y~S=&k_*W4_ceRcDP zxRHlM|Yxo%q?NHIBvc4<8c{)C0ELgt^N3GNBkGFOnT2mh}pNXv#SB1SQ$e|$o_&EPV zBy%OmbjX@iqa)E(2%&NaUf*r>=}+%+7?gFMKM@{!HvT-P#wBvEUZKK(PKl0U$MF!C zk3;q_P~VM1;wHMk`J-4=Q*x8S(PIfa8%qk(YozUjaIxN9YF-vKBDn&bg z{@Wow?XL0T2^oRQ9A!fuRI%j$%kF4yz}1Vs?yJG_DL!7-)O1%!=)a#8I~LkZ*b}yV zRtMWhY=!#0nJ}hmwnA1j7#~}45u5gFoUk?bUl{NK;<@BqEPDD_b=|MWEGgqLEa+#? zc$ig4N77PbWyxdI9(Ruqw{U4%+TvmTz7HLgO_ur}><@};9S&ABRj2jt^*vz|4p(sP z%m14D)dOilFgbaa-`JQ6NLk00ZftD0jcJan0sTwEuYjnou(XuRw#s7hTYv)DS2P&2 zApB~)%6s#Kcom1#unZQ!s<(p?_BxJmT*)O+nT@1>4YK2TqncR)l6^flvrc_oe`cCh z3PexO%5e9yevCVuAJgv80OkT?!ET;d29hDa3}}pwM<>UM2jXoXb`BrKqz0epIxR(L z8)ZXgn8s1CT0kE8%z+`f2$D+qL}vH7A)|J0fqe(0*jawgpnBN`)F|eC82w=sNV)#-^Fu>Bn3dC& z7-YlCEgyIO#dZT$=;f@cbAcPU(_(jLUxTZ#=BwES)=F=Vv2RYsUtI74JBq4d-oiRaSBTB)}X^Y^lp^JCCtxW}-vlfh;V6puK!tU}(zEC+- zoj9smUJ=cpkuW zie2@{a)N?N=Aq|*-r6Q4SR{jwus;>qM@B^C3cvgCBzyi$_CHH zEfyEE0diQN40pwc=jTLe66YI^VeAineiF~{J*@wHtwK7wFm<6~8J%fEUbRy9q`;Tn zyS#C!UYp~qTv5C{kt3-)AFr{?=i}qfemx>`ydf2JJI8=BU|T8Q818dPTy-!qT9pn~(e7crBAe z((S|j%!LmxJCyTg=rUnow!*%5Febn_>+28niD5O6jPd0Jfl12KC0W8=ZE$eDKEEIY z^`r#3RsAFb1L-tgak`}QMngrNo>N^j?B6H#wiwpV&Q5G}v{Xt`GWJQO`vmGFY!pRC?;^bTAiFQnO)(Tulm8zIFx(!jHy|)Pygu$|cq$a(tU6_TlP&7HaI2q?t_3-gj0g89pXJ7r-jh^rA*PL%xf>ml!92jGFE zXj%9h<(vo%|7yyqXl~>~`4okZr_cr|=`UrR7kpgrl0WY9vgT#ghdy<8$bH|#!`El3 zIJ>?5Oh4F$dkOG8!giZfrwh`UvNK|0;=K7ww|C57y2pQBoOu4nyp- zv#Uk~qV7I`F~5jicO+JYSxws|Q&SiDaz}9YM}+6?%gc=@BgbEPf?{NKN$&mUKdD5hEx6-%9wEL0Gl zvpW%cf;{INsg2V~IJaA;cXhwTtq-0mNrEgY%bEt8bucfa87~bDmQ_SR9Tn{={%t15 z+M->yhj_RH)k%9gkbt_24pZau3_AKhtn6Rj_@l6CQ$Ye!UD(^ZyP5m@ZVen}9!fdg z|Hce|-^9;S@gHZx=73eN5^M85GZ06j4`U0U`JYqNTqv@86LFTL$h*&90dC75jBU{} z^;$3cSOf!MqPb-ARPvz*QdC(_dTe<4=|X*)wl)318pD*o&z&8^GY~>)?7b`G;y}B1 zXedwLp+2rdE}~4AfQTq_YHCV+<3jTh8JQG3S2<^G%@)WqlSe${`{>ZPb5rcA`}HI{`3Dw*;~g&)pk+Cf}kMXNK3cU-6h?f(%m5qBHfKc zN=rA)&?VB{-3=1b@g1K#zFXh>dEW2){rKa|FfeD%oa@?auf6u#kTLijDP&!rT1%z9 zBQv?1InV8{_iE*LqYOZ9esC5iouuIH-7GV0dUk%E>+Y04&Q#r_ETzK;s1EpgZgci)pMqrRf-A+&5|aK&ZOLIT8Z=0ENYoFl)$>{Dl1%DR!b<6k%cxym}vcp!B zG!z0@A0Ray#5&PI8&&Ocw$jk3PZD#{)KKqo6(hiW22JvY)Bj>fZca_7@G5m*Exx>- zBQjiGNz_^FEe9Q=BHA<|FS^Iyt4%}tKj{0XuPo1i^<%*E;+?xQ9A(0A1CW-K6z$<$ zZGR1T*h5AJQ8t}BkllLbEnrcUr!3Exc+_|-00{n4_`TB??e|OTM<4DTbxUt&rqVrk z?}^z*xq9T7S-#kEZ)Q7D+w~v=bflWI$mR?D6R2)m6CSs*%SnX!u%kkYREm4&)reC! z&mCB2iu?uJRN`x)P&>-#8tu6LF&~J%lEPrfNndK%I;qo|Ny8I5G?=e>=)5n+tp2mHC(hbah^Lq5j?R|B8>#(go`z$*5SJdjB5S9w&7%a&vgH4y{p``8lk?rl_Kv=L~oys7-2+bX}gx>rHPv@V2nO+kwE|ZEyEe=cdBedwQ+P^3C2Jtqxkhz zev~kxZ7OuD3-<(#TJc3FuvloL?o4~}Uf`NS<*9Db6 zNI_9h88teH^Iyg`9OxC{bMb@S!?(An0erJb58xa6 z({Bj>j&HbsB5>%}fk25qEF=UMIx$=Hzb@B`NWWy#BK-Dj$Q_pk$N>?cXUffhMKEsi zYLQ52k;s3MIb;v7vjYz<1=W0iCu>mbI;@}4mzWqYGo}P?R}TBt;tWjOJqoZm{(yJ} z0zbK#IpQu7VPM8+yVmg9MsGX-yZvGDo12?09`16?kC&{mXBK7a7hUPn->-$zGw#e& zWzeyDopdLk1FB=NFip|4{bDOo4#rlCxFVFd$nAUAQJQ4N&(TQ?`&jvjdd;K_9+g_1 z?7LZZ+w=Ingi)9r7V)+KFH===41g5p9pAgpDSS`G1TPg*ZPWPkyT*Fh%=ZV&t(2Aa zZcoDU*zO@~67^_9hg*{RzW0#S5=)FR- zAG`Pq6clCge6!r~*5gKXO-4GpoJAhDQ6itm{-L4#wENq_lA4HUE=SD$O1g3|sKeRl zht2!n3Tq=7Z4n_F5UT;1(+m6K<2-=)-1!V2JpN-|P1(h>_`)C->L2LEKm(nV#~m|0 zDP`5w3FY!6M*^t&O%Ym|%LgoMWBvWL{)*p!2MNG$S4f~q5j{)A!J-ptR^!~kEP+me zi`*Bj6~049$d~cu+wN(7QN+*Rz|hGsCN!n#ikbumY@U*DSC<>e8xhN?eT(M{Y8Kp- zT-V5ER^ULW2W`g>m;HE9>*Z>3W#&0Rkn@3#A^OL8|IH;CyvMK)e$Bmb^AZseF*i4t zygq}B@^7l}|2XfbXsC+AT@`TMW}v&=qnJWlw#13Ok1k?5$zrbkdzN2v!eIjpfX~+q zqct~gAtF?^Hio;hFO7kr^j6flpdvafl1!eX^_}}`MEXB>dcQsxz`1#+hqyH-k9RKL(_Oa+qFucv8iXwmlISE03|>M2fPP|1x5p<%Si5>8193L znlI+?&j&e{EtP!K)p5M<*DbpP0-o-c6~E3hq7ucZRk_?k_+gnR4Y)>kQ_18O@L#7d z-Fc}VvoqjGY1Euwm}AoIF}r#f6ai{^s3X)7C% zZEkN@``Oaeveu7C`s&RzA|d>CpGCcT!^Ru*z-C%EAHKC`LHQhpZVk*~tuI@97XNgU`2WFJuW{Hw(JWzJc|hZyJY%z$OaAyr38KW zj}X`OeLH_6I2JlDw_K*q2`FYJj!A*jBlu%(SEcm)I{hWTxMn@s*#Tt*;%0 z+}(#E_>l+*fD%&X=yFrh2>XR0S~@t)^bSU2e|#&QeriKSHcHkC9R zpe@D3#Msedj>CH*@i_|3kFHMEzs=95K3o|A6TNPVfr>I>>M57wi1#I*;Lq|ar-_CR zeVz<~1d{~~COV-czt<6|`f^Quje?a3#-tiS7O2XxXyA2r(Hi=mDU+hv{Eh7VZnY}U zZVlPjbDHjW?%j{w;TG2{@+h>fbOF!NC$W&xMTxMsl{q&@W&Q(zG!kasTMy>74=xGlK}1&oX{F{>%_mAsUo6S0zM=e;x! zJS8OGW%>-+Ufm`zO*FZscJ@;*SANow(fI-H+`pN>Mtb3nzSs@{X4M|MfHZCHSU4WmHisI+KTk&{_cO`v`iA`BY*Z|M17(85TRAWN`b zuTR`FnuigRe2Z_iwll*^m!#t38B^uHM)#C*UD3E**{oJS z$eATiTYV_T>iNOj@sNTrwHXq3%Gv96fptJOvpC!L-q8{2kUx^@8n36PQq<_12x}AB zN2g`SSM22u3^O=7JMcm@zik75-hTmpm)}#iM$$|S4N0$0B7J_pO#l3=DU3ImlWd8I z7>bKwH{940rKDmq>S)u4nv6z@i>@JiS||i$3m*iHtmsMy2i0^aG1rI%+9df z$HM`eQ+|W#l9EvseSP_EdhA=EEejcbbV1)&S0vNxbl2}}%0PN=;2 z`Cwm8$u+apNlXg06wxx70AzYYU1#pi zw6Zh#yy-7$Zc^1uTE}Z4hB;j!%e^xn*=6hE?P4=l$`MV!f4kR1ONh9(KmX(2qvw(} z#EMlO<@8SB^f9GA@#`FNqQ!LQGlBA~ zyvGI+i{X?v{yq%7YO+y6sEo%LGhRR(eVw4@1h*68ijRB(_e&mK5?|!Tw)aZ%MuzosC~*X{(=gQqjqh>E&KY8peu3a z5-4KW;PrvR_&mFg`K>001&4J!av$XUut47~P3T68%5}c9Sd}WvDn`E)G*zx8grn<# zP;Y$jX}dUr|vrGj|-gvi_!=Xh4QSdGK4E8Xcz@ zn_hMaa}=gH%ZWGFJ`~c@+iDtqmiETx7rEYu-%rXYJ(*c6;9J?tvGLA;q^LAub=&Jt z+zfYmvutJ`ihcu2|Mj84H`FV&04XRs`9asdcBsu5+j)M(B+9gNm|lSnqoHFobO9xL7ES?8LcseX4JGR1kd zYBr-hv)GRJ9(}sHb>(C4ipCnujtEKKfsq#ccFTJ9Sx?JKwmf3rZ>5kw@R7YdkTScB zZmZg!@3iB%cKp|~e*!}w-8LQ|<|3l0lI-na2~j*{Y=P1i^R|hOVGN&62&pIw*_%>R zw6H;{ttP=ngjx6`Xyb%&Uu9Rn#ytG3jYLe)?M3)bSd6XX`&=G*VyC~>>LeTtEG!Ll zy+`akP^jD!b@t5%3j2ySHiW<&ORco>mX-|H!#Oe1HqUWcj+l^RNEL(j1q@b2NPeDL zlNCzhL2v#@iusH1$o!SUx7{Kd5lrOVaZOFnA9e%m44y=SSi;4L*yH;yjtUlwrph@!ztk7lk8>lPeXF7X=jw~dA|1{&`BTbfQse|BFz7$PdIQrC z7!}X@*zk9D26=YDkMwz=v5^ytvrF3QALZ%1FIEg8huy?GjcoIt^OJfS7h|{17boL1 zwB&8nH4<((y59HbkjD%vb8VrrQFgQPG!7Tu+Jo7(@629zPpK)a$YF2Y6&ge6z$x}e zsl&~zS>|O#8WIxE390D{#C07fb=zrNpP;ysksiTOC)dXx(c0Rz&p>eCELQb=uW z?Z*DTbY*2FtKCwp^8k}XwEwEyiWl}d2#;u80TC?gqB1oms%pa!Mr>`D zmo$X@;>U$5j8~3E7suFi^w?7oLfRcq%^R3GReiBrJS)P!r@jBYmlnd?#4La8=ab-q*KcV8P&mh2-t@Qc2d|jxk zW2%6g4vG;XPCiiQVO{&z^u^DQ2Tj2Tbodee$DR2Cd}u8CKd>N>GYhgndvaBI38j89 ze1=x-l3)>Q#fI}bJE_c^RJbwbUg{!vR`}O_vMGwQ(kSWN z9iX6?x zfOY9EP=+Wv@ck^wta=iK$%(gg7e^`po+Bg>_CQ;t zp+87K#XiD5>mvX2?FFr%H8pc2y?WzX<3mHYYF;XTN$+OZ-`h_(j`6+@ z>hg3mQ})sGpN+HBFgQOOP9E1ZyYD`5RW~0P9L!VK_a59+f@s=T)-?$`bhZ=GLvTBU zA*=8Xn2B+sqhDw+`_>>^0|CR^7#bl;cY?N1hZ^88WNge&`$dxTs&0IekDjOE*b#@! zVaHpbIctzQJw;uM>C1Q%Z+&lpPIf(P25pL{mQ3sa zP+vBGGG8OzOhB1#dVXr01RBz0%$|=fMO;68B?A6&@1uR)8G|u|b+XTM)S#Td!aOxG zA%nx%96co9^h(!ljy!ux1xAWPpk|0*>{fpuG_3w0Hooj2Os~vbTZG3FzFto1h;IPZ%b2 zomL;;3!tb8(-n1MU_yBqF!VAfCw!UsRzjRgp~lXSqSN|ly)#pPF^(;rak1tD_vTZa zUu6^;l5NZVsZrsQm5viDi#%6%=gEDBH#OwJ7py8M{B2p!eJ3T1L`ZjcQpox1<&;ES zkl2gs8s7N8d~{OH2^IVs#{6Fn-cSQt*j8<7hA2{)iU^5Ggyro zt)>NZPk3Q+P(2eIN4R20Z1DKH@g(wj8V3S_bXw2SBy+O8kU&-Oea0zI&wy)fFX+qj z+Yc|P&HpvdJ%M5aK%lxTh_>tW;vyd)%dkja{Z*6xCkyiDu^$=ydB|Q+Wua|~rsCpL zB+{Z{jET*jI4$g{&7QG2Jj?x$g=J)!bQ@z)f+iw-_Z6OvYjG5e5lWOozt)9?EA3=Q&^r0&y#~M^lKTCQu9H(9z<&Y=2Ii zABFs5$X86E{zx!y4OZI|hU2NQ2(^#OGm2n8&y+++yv z`dyOC%o!auacyu+&J#X` z5^N)c8-R;`rH|E0RcvFI^SbZU++CAVwYGNV2eCAe9XD|}E;y!IX^MII>BzcPFVFf0* zQlPU%aNn4qHT_=i;&x`T5jQgcT-l3+V_Ge5+WPUH*Y(f`bEy5WM&JFe`hd8ye(t4o z_$p_TxsZ$bSFiAXHEm9HLu9PZmNzOHG!ws_*B?>n4LSUKl-{Dn2J`aepy0( zw}5m@7Y!9FGl{vw+)%efg96a@g%vU)?C-(2gj*FA)z0ta{ zomT6n&=uAYEe|=`*iZ>We&Ha9^%m;SDs4)$NENIrR#db-8^ss_wgvI%TdWW}@ryB#%H$VwcwEWi2d_(*D!kXB zx4Ay$q3!QATGayQEATWPBn9u(qYzOJAIasA>k*~1UcUCtn>=nQ#YjDzrFUc6!|F~n zu^p+GL^07^Hl0zQ&OcWawMP1iccIL^vxZxj8cNf9rElkBGMg)lbEJ?iB?CyIA`abk zFNb=KoA_HS%96f5qwVYeJP{Ea*RgpBv?699;j=@W)7@daYgWQ~06S~D?C%%oIa<*K zSi-|gKCg67GC2~q$INrm=}6POFVBd_wJ-0Qy<(C#|MCKm&&?@_`s{gA!(INWAcaRUa zf~X6jjb%a)NJ9T0XHI6^7LX!>C%>#3BM5A7~a8uwY zi{IUM_inEs%x+hPXC1B{SZWhJ_e#EZx!^l^vkz~*`bxcW`I`^-EycmvtS6)OHY^pW zscy*-r(H*a7{ez0!k#C|`As3VtFN~I%ZUAB4Z{(WxAZ=Js(mNCf_avk-mBh;hFr{u z7qIgdjr}bKJWvt8h5J8pu$^Q-cDM5#4nlTBQIZflzn6rBdMV-T~fW(X#%U@TI@m+9X85&~=A{2Dq9R%yqqsKIF4$yId;u7*h zb^))eoRGE_Lst<4E$YAcQWdI|{dEzRg5g}%*0MbgR~H*BF>x`a$@U_CZ(sx&TQUYv zGIW{;7FLCPsTK$8G{?wLVzC8EIN*7eCay`(d4ThN=O!&6uv?{)E>*argT{Uhrihw8 z8}#%!D_wC`Lqf~7_iKif#91l{Y=pZqk8PXN73uGy9Gb65=joFA$<9Ai=XX>|0rNoJ zB5a$;cL|r}WxyNdttU5?QUu@?xcqI~MnA^JOWD9yQ2e#SW_b+eMapkXtGeo{p z5-od`yz=I^dy0d64W8pV^g=FP>u42sS5-u&JW&*xBAZfvBWmDjzm{bjc{8JUyn*!kGX2KKZRtr>2-_*>ul$5Q!|v=IAAT6{L6prGguEc!1j`5$}I5G9~7uYC16EH!K|?E4H9 z+N4Q4prEY}`q|c$LM)b2Q=8K{yGbShhbWa*2np+IooSIgpQC1DhNz3WIV#Zx!meCa z2MCKk|KpO?Q`m2;N+43F&Cg7{RnC{s&TP@14Q>y^qO*8>Am|$y*r^`WMAG*^*9doRf1$znx79upn4qSJ6Y_CI7SwFQ2Gw@Uk`DduN~rmU=H*9hwfN( z@7tK;T@Tfb)(v+LS{d>a6kl#^4)Yjk^K35JCtifQycCzg?av1D+zw7BwDwqZfE(*< z3(Sap(l$6PqXR#FoM9m_`sY0kWTHV&`~`ZVv&{7YS2D6}u-nm1B>NQZ<6;qPT!0OO z^W~9?^J3wb^MV?(brSQ%O4Tqjg#i4g%yq<{R2|9xz5g-X5or6t=5Y^d>3 z4^UU&Ua(%^UYK9_A1S{65QlYeDx!B{ePK7FUd2&~!ZAOH(IT-Odq*wP-BXRwuiy$! z84K5CRIxL7{qFS?U!NmdBV4g-Rc8%ZMW%>=1uB0^azSNyOj!ecPj$ajeq(kHy(lq*LR!W&G#E5j5N#X?Q_L5-2d2 zv4TR(Qx;OJU$?5i$orqDtxbV)8gzfb)bL`A})bGzD-tNsM@TUpB%(0T@H-$2xzeA`6oa0aC5)&>D zA3f?)UzSIVM<&bl-8{KZ@TzK-*T)`Joina$TFj-SV65Lfnk%z*+k8|j)e`GZ_Fe6x z0F{=ei)BBaMtknuQ`zMW_*v%gOGLsKG?sCuANg!y->}w9jJod#^LGaj2Pc-xzdLdY+On-dJ>+X)auyR6FYM#?fxm|Dl+4IuF z`R3q^rpI@dX0P6PGBB_#E}`P0{JN>HbinXlDMu)yGpm%3#AbtU);6m{da5|$sfKs2 zW-z_0X`}V-gob)wyLN{Z}2BpC@`uIcNGiK7j{Uanp_e6Vp@#`rX|(sBTB&!^E^6ZwSj@ zf6&*ljnV5Y!|7Lj6t+S>qNK#Rc`R|__!OrtFQV7qy0c)PozX;U*mFvjZXYiJ2y0Kw zXQ^ZW+Cz-jt>I-9Md#tm9GI_nM^X}FQ?s+#*-GQ{1W7ra71mXaIae?4 z*DpO{GTf}aJUuvi6UIhLCju58Qeah2+AMkrK2<>*-GtRt*QuA)oT}}AW}Pvi~N~0YN>y}BA^SN{DUXowportba`I<1)3~*+{dBdg7E3UIZGP5i{ zO{x6@8X|sg%)_CQgsmuIg9IDg%NAT_#z5cawVm$PsP_(AZDMj#Y+LUZ)%&)umAYy1 zy)U1MIJ6Cq?KAJwPGW3v{3dNPGb+9x57Fl{wPtuO7iZ=L@lk0a`sG?y6J?WqyULUb zj;ne_j~hm(xBV~0EexaYF*aMzK#Hl@bYxUfpQD-vp9a~|_7T}PV&jLOzA&F{Mp3c~ zzvmc@mY2z@fHR6UX0Q~O`EASFMoYnXDSz_dUxYm}H!10Mc$3aPMWDb|M$vwy{KA9W z6C-rwkcp``39+(a_`?;eN3lIh?a7^iNVuS1GDqP1TZM}H^3$F5RY`_BUUnDPihAYh z(-|RPUQEAzm4PYx)_PCos*5sP_zC>;|75%kJW%fPaAzlZZ|nqKBunrk_jzO`M>`T= zI*fs$*u`>d>Y5`h?Y*2YlRxI4g`fYZ=V?hRFDat0-I;YPkf~t#;ZfY4bc9pE%K{QsTu08I2$^aLh$}qgfjSs79;H;_C(EVIHs5gHo)&5 zW+S+@miu*uzycs`H0rJJ-eYpWfS$pT@iV~s_edx6vo4wtf-w~k5I{pt-Ua{ZchdZy zVbP!g4Od3x(!l5`R&|K214H;;SVbA&r6Nnwv^2KFzhM8ag;7+{Hb2EXOXeh+{a#Kl zBZHNevPJ#vfBKca%f9_fr?4UiBggw7|MbOnpN@!#$l#0Zy1KeCVETlZbh6&M3VCU% z&H3HgYtGuBhq!un4&{fk#RPWBaA2RjagKM|?uu|;+LBJ}-dlPLDS{;V%z`A&sPGWV zuRPt9t#97a_Rq>^(DUxMZwuay(1EO|3-@~un?C>(nj&e95WpwwBrD)nJ^pb&!?fBbDuRxEA=-Tvbxc;&zD);=HvF z-Eq7)A0Ji{Y9DDKs!D&{;<<(N?DiKV$EgQ=es9aM=(?mc7pwc$^R!>p=y7y=c}x~3 zBRBR*Wo;L(Yw<3mIrT_n(%id^dlY45qjnO@?IhQq?!N;DyS-Dd*Guv?ifD=wCQXz;JB4|7XspEw^^?rO}n+??^~)$Ke3;k*z@@=HCAr5Rbb#JUq+l~ zDd1rc2x-1rO&~xmY3g}ay;1=;-tTE6BGI_^xF4%jwx+rzEZw)~>+Om?tNU{8 z^wf#f(93O;#%uTaZvLcYjKf;aRzXh@PV1)UzCASMKj1&dveHtgogXuu?sVSzKip~h zwvb1A;uTrw2P_1*nBy%O4GP#<_`d?WctE7r1d#1J@HPRr&QQVZJzsMnxLAbiwe^AZ zwuCExD{A|Xw69uyThm=WJ_%>BpDnMn4Ga053g=bf4KhhPw%Pg0 z5Nd&GS7F!w7G5XecfYfae`SaN7m9xc1hmiWLk~-Pc{L%Z_@n=i%_)cn3hh}qGP0tV zqaz3{%2uruC@g3S0?IoVF%>|3RQdtnCumAI!vv|86`bANL)VV&G^Cfjl*dLL;8_Fp z8`st`;(DX)coF~PK>R<;7)+ID0%i$9larJ8a-HMFkN8flKc?oLXHBH3Nl3DmPqgf= zRsvAIl*sUXmaW~lG4o%&1Bk({hRTgYqlbl8lr*7D8sD;-vJ@uIIhJlQOK(@+VfV0M zqkO8hhw{GIh!3+bSy0hDqTXl^0|#Y;gZfWjj3BIsb$lRYwHnDU*`If*r((8TZ}~!1 zVP5uf6(y6T<(<0@=_J<1dDrI2&6TOs?iua|$Gm*q{_Tab@^G3)w)pP!c&}=p(`GJvuJ4abKwmhj(k3Gs0Q?_@YT9+vs8=Lckp4O2? zUws2iLzNHr9P%75W`?Cqm9dsXAjNK0Lpdl4U&$Wx)Q&UOEv+=(^zx4^6)r|zjaM;$ zsebQihxC-8CSikHhI2apu?3IC0lM_Tp<9qbvt}?lus53b$UOWe`&aUUGtQ4Vd|ZR} zgN2ql)nnxz;wa5Hw~mP}%&;ijTiM&@q6jqtY9*Fj*-FS2_~E#P;e27@+L#vEQdw{@ zEAWIY=%alZT-whPEl`;{xpN_2OZoI38upU~g^9p*4&;LxA^qp&;y%qMMT^z~>gF=v zQL>fM$1Ge$c`0C1GNbcc!rHPcSTI8{UTqz^sMdfqOZYXUo@;2#Bo4-B9y`!qamRN% znu&EOnkuApZ}#17Hjvm_ZqoZS6jgond57$&AsQ`k-} zg9LjvwH@$rA1e-}#R!WG| z$f|vxJ*2y{J9MD+>!vD6$0}*r9ZRNk|FTAz*U)N|uXKuU-RKMGs8@d8MZqlm^-#}y z4jle#C*A+Y9R_$=78}%j`T01c>K(ekn>R5X9rUgKU2obySo}g(|1*7k0@r{GMW(n& zzMh&9R%olLEE1gppptpAl47`nss>x>+cpjf=gKeHX|JTR0$|Hsld$O?hHlt4I@er{ zG&W>`7A80k9WV52k9DiqS2yR`)<5GZZXHb1b$$`TLyg~(&+(zpOIG#^-}rS92oHUA zt~>nofm>4&z9{C|^>*eob0BRc&@5(e$DSAYQsf>UP2y`0T}RdCHEhvF0!d&uFy>Gn zcJNySa~PMQ3ZBc!qTS}yeb|{VQ3>gM^@6&fx^2Szd^C=+t^+`RYECmE<=Z&6ZpKU? z=HMZ!H)$x$C=;u5=+*6adzdr?@EKhrn0DbB#_ostI#c6^;wp@znIB3qdd5!2E(h zYbd_=9>6|*frp%+3uB30b}js%MOZjrG0V=uEHnvbcXJ)V;L=u&w2-fW#?JIAr%oM` z@2#SW7@eWVo{G3Y%96rfb7sTvU%6(I3|mQ_u!s(Qv$LuQAJ*?v?GJmjL_H%5xWHX} zRCOtVv&a})Gj+;dyJlg(PLRcqpTW?4uXuNQ9!l?_Dx#mT6$cj>CRkmZ0vDF~ts@BM z`#zr%Y%Kq{d-pZ$*e6LcESwVqG*vx^EDba$mc!zUn@mk-MZM@cEeEG{zYZ|zN3in- zX5+^$F@@8H8BA?yRy_5tHOnZ}AwE(-IZebgL|tD>*QkkDRwSD~tT_%XV(ze~0RnQC zQ^-`Gk_L&^-FcUc&NUwbS(m!C37QW-YIUwgm3Ltl!%IQ8sw z0?%ujd)qt6Nv~;-nXw;}O`lZu6Ws#DS{QW`7e-zTs zHTQVcd>$Mo9Cs$+RtKjq&{&|p{BE}%&9z_;!vG&4y!aiOm+e}APcb|Hl9pAnnT!FH zwY*jEkBi5;Yy-j7g`Dj8owNLZf#$W6CnoCW(Mn@N(xSrW04+#UGEu)up z;JP5bhMp<#$guOWeTv*^HQZzUC#TrP2yN*_ZX*pf=l#S^nhp1VS1q-H+dm$MG22bxeKJIYd})HT zgUozC$Ujh2-+fb+`?$%ecOD-4l-TDAEpd*f!JONybV?f!{|h-saGXTc0f(5e4uQ)F z*H{1SHJ@9J#?`Ic%+JL7E#WTjQ21JX^mG$=P3f@?=ENKYd{J5wV;58l&A<{sLSoIQ zp&(*$yy#k(xo`niuSn|YUySK8@vE{Pp}gnTJa12PadB2~QY4}|X$auYhf!R^t@#wT zCdKOnmYKgP?ybl~58tOBSjyvlp26r$l$@LljITJaOxRJoxVg<7S7foxrcpc;KLf>L z3rffiXJ>L8Fj>~SAbokUW#an$J&HV?J?O}{s$;1=Wbc)-Imm25;WoZ?zMRI-C?r~ z+kSOcnff|IrdOybqGLBw}+rn@X{s5-uEXr>N#809MHwbssO^m9B?F?;yKigpD0}WpY2oPlPNYTm zqfDXf8M-S52Q@Q%n>8BXaDdP+vOG_-L(@?t3AINYKREf?FfvIarM{eEF-V7aR-aK4 zzZ|ZLyZCDKZt43>7a6AFN%B>S#+>0pBfigE*6e6N+dAS?as|8W}!OcD&sy5 z4mx{raiMsT6TddLWAcD+(d|#V*{I&hAEo13f2mPB)5~=z_QfdCiPJrjyF*m;F5#nd zx7(!pIH0HaHVX~8((XVT=5<7*0v32k_s$78vT3XR9p~Y73f(`*%U{F)FUo`e{wqY3 zpEaYkvxDPfc{IRut>np<-%1g`Bs7BB(2gt>g;@sOw-}RHP>XAT@Mn^bb{}>LZmIf48O}i;$k_kC_iG$uUnf$R+JVy&Ls+@9{7|2O% zEjfs1qU5fVPqh$13vaSrge2z6rUK%haTl~suOsj_+u&!{?>9x3+!|U^itzCFK~bia zgHac*MU3j(Tl2th+Z?{U9|>4?UhB7=*lBOwNz?lGDjnr)XtU@@YaPcQGi>Oy=H&%M zpmeJNwU4$T8}^36`2gANK;u>L@R!EsMA1U^*AaB-=g^QFc4UV_+1WEXzZyKhliY{SF#ajhn>k#D;U$y5m+nfV5L#E0$+6#NCRa-chAy*r`8+$puhR$EbXfEcI0prh{7o5qm9O!*Mm zNtxVnP@ibSl@#_l=Bwsy$NF(MEZ8YT3H|5jsIP{dl&f}Fee6yh{4ZfYLE!QRSJ&4H zD7en$R`o0otldb^Zk6H3Z@&(Ic6b$g@w}QuxW?|u;_!6~?Qp@iyRX%ebL+A7T;rjy zKISN!nU;@oGp#R&==Duwg#FRo4*BLCm!JNb76`7o?>ak8L}1W2{=lYilvy`(=6&>G zfT%@`(c-KZvM<0UZTX6PD$goVeIW8RJmtNq%vM0t;GdadR&blFN4jjKu*GFlbziQ- zIjHw4qlW(W1`s;kCOlyI4cmCU^$U2w^8bHL6cFHN9-tZn;cs>+1x$kfUCI03SMi^V z-LD&_rkQkjjXB7yXJ)3|&XAY4*I?>@5Ez~QemXBpaVFDK62{E>R3nk-3;VMnY(Pdw zabx0RZELkZPK-oifaISPpw-DV)Rp$8ljKq0QYa zQ(B<>=2M^u%HlXBC3nzNsphhs9^kgXy;tb&JSv96t;6cJ+~Qqh+`9?%bj;a#mqAva zARs-jcx!6#*1nbEYhJ#Rwlp2v)YQd%4+tr``3{ZGciu4P)t6n#iC%fP=r@c4c=Voo z$?l@jS+X*6a!G5jW9NMAC4gT`%E zak8(CgPJ^cO2ZY14$#7Ot}*TW<`DUY6+UFfWS9zLZ{o4Fir|4>kRQpOZ~ohdq`*O> zgbu?H%ajn=uoGY$p6|5Cp2vGVTOq;tT;6|mt?ndHSL^J~(6?`oj&S|pdFerG zVNt`D(D_xD$B{W5GdW+YMQ#bj#}rDl_M+z#S|#X(vpizBk}S1c*OK*5n$N?&Lr3Zy zrHbvN={jJ4`xa($1FQkar`Wz9V;Yo+kg!n8puJa>F3}qNc@$XIaJa(&qvkP zlq;qm=T4N2>Xe}Rlw+aI18l_>yVYEsUv!V7Pp$Jlt=LDMabsj;y~Qah$CB!v{Jn(+)*HIyIxn`PPKdi9P-9E0`!DqiA7Elu5)qYS5^nY?e zL+WKaUQO)xH0t^Pxvn0Empt1f9D$*g`iGWo6s2m-(gltMRuDa}Bh07lAN}CFU_Mw- ze#C>=!1?=z(7ZBu1YCD85aG$&zrqGEZCTrMWgdIo%S|_W9Gm1NJ}e)XxYjn#ai3Yo z^GEAD@th5ud1aa{u~aLo`7HgP@BY7^3IFt@3oJR;_>wnEU#8^VGteJP_pgfG zFA)BTe*%Sq@i4_FQB%B>o3G+uY~%{(xp%Pl>yXct@rR>@its}a`V~=eGabh=!p&+W z!{$rb=M;3MQ>~1PayBV8jioBGXv1uC{;03Ep}(rAa-e9w2~r=A=gFL?n`t+kj`df> zBO~a=llIybvc|~U3-C5aLH>d`&{L2cB zjK6Dx*-o(bOe;RAoyuxGlr+l3ID+7k``;3r#5M?+?H)w8N~X&Th)-oZ;(@)QzRtb2 zsxl4Trs+{#*nGM#{h*V9IbwLT;l5{ets@uLxcJ?~gbcdBHiK^$IR^UC=h$<38aGc+ zeQhdGpZ`1c;>}IDBE@w$-O|aP%X!Z82bp#HEH=&e#z zj~)k?OT39J5_8ATZ77xKhg=dc$0rQrWl~u?pRV(0jv1Tu zif4~A9JeISG1iV%iUgCfr?-zSTzYLht+@vklO~D%W`g5?PE`@QX0pUh9$xBXFQI5|EIpPK<%jJfgGxe3do--tMy`OfO{%*&Tl&~Zo zd-H%FJ}Ka4jgwCB^6hR**vkI0h9Sf9dao4e2)4sOKDiYS^!#Be2yr0H zUDHR*%WhHYW?K2yu&g+{WAw8g);lHAuY+EX=c}9ewVpGgZf}op9vyzT(we}ZJS{a_ zo8v93Y(MF{pG=<8ljPc(z|VNqZ*2Pc%rptCwd<=T_k8&YEcktr!V|Ptf^ET1hG;kt zn*bIta~!(*@8x*|_bpSKifr&+^*u94JoWGA|9>6qz9sqbFkIrCTbMI^eSMwq3I2|I z6O1AD~$NH#;o^44ZEbfgc`OD zW~?osVl|Al6>*^H-~0Y}Dba~;@<%Q(fqM0Q**9b;jZcJ~h{SU_<31rdS-#w35(zLy z*V3vl3k5uzg()cZL@7KxypR7M+TJ>>t$o`XZjrVWDnNk(1&S94P~4@sy9I4=cMDod z@!}AQySqbhm*DPDEV#RbH~XHm-{cGVj3u$EMT(O7kmyEa3$LIO{%oJb|_StN!Ry$dbA<>TQx`C-MjS(08B%$NkNm zx*!KeCnv>=0&{}H7xdHwTrLTKOLzpW?kQdh1I;af!Q|S?#Bx>J%%h@#jb>FFGsyes zB79u^;10>D${(x&ELL-SpcatQDxFLJfrIp0)|bWpIC3aoYWS=sve!YG>%RP!d9k~l zDKa5XqMb2*bwR6uFq(Go{G$gY)IsO&+cshDtE1cZAo47Bqsob$LRt0PD%NS25F4Eu zO>8c&hXu@KOQX~FwNrq$G9{nt6jQ38bEO|V-p^2vyF5U5Z}$ioO;9zRNK1c=>z5&~|ODxmfzj<*HHlChg^ zt$}rydI=?lvq$LbNp_%$@f(L$uJo)2jw8Of-hOW!lV1f1rd4@>2Q^{c+-N#G(HN`}!}wB>nx-K(XZ9XjfO4q&fcJe}lz;ZC#~O z=vC5*7m{?EXH91aaRL_Xf_E>(aO}@1=t_NF*Zm%jk0%H zZQMz4$On!eZ`tUm1Ntp2^4Ho?JMQ5pwFj9kph*`Edme$Wmj$7_+x5%Aoaz(x4((bg z=+uL3cAxM8z{IOm4E7-i4DY#P6I1p(`HCXhyKomT20dn^Q{D<~dOZTPA`*%mweDyV zsvJG8pk3vf7M)a)Px=LNdROhR?Xhg>DvN3K0^wYh#!A@GxPwX0_MG{Hb<^>jYJX?_ z;v(N!t}twSa$e1q(5xu96k|a}Me2=M5*^XDK%IPIW3m!!bg~gCU$C9YD`^XLE5(VB znfCRW{j+0lNObefEaS-0%E-6=jaZzs^mzeED8UYHk?@nh`o7jxiuV=uJA2wjgqI>P zN~7{soV@UCBgPkwG}vJ!{q#T7)ycb?YVw$^SBC>bpVA!dR2Z$VawuGyo-Djabu>0I z{<$R$D6kwDoW>{Rnp{$;Pr5jBp~a)a)3iLRc2dv%KJyW4R>sThx@%H>1TVZr;`XXh zI##6>!v+BdEH?}_y$KcWajuZKSgf{)5oyjS<7HS~Ab`V5`zr_!GJ7jhr$~p22c1Va zG$?3=MjfT>?-u&n`7qtOh2Nye0iq_SUx2#KHgXDCX;dq2(sCEyfrI)kFY&H;j%||+ zXWVW!@=w7#Vvwj78zss`w%@&hit-Pww*o1bU)!{%;%?R8x;60wQY}x9 z0qHh+X}Hh6lYMpQmwj?*)k-?S_08kYMA7FbT5qZYHF?)zPn4nMi@Cp3-u`uJ`Pb|u zkms@Tf|ejM`ZGggVIed5-GGd)J9&Nf<5@w{T*(yT6f%f1l}BP@KB#YAqT z_Tdbr>9EC1#OD6Ec8jjX`zJAv+gHseH>-=htN)nj3{XU3PmF#3{6twQVSaX2(#CzB z2RD{=+QGHD^7Zsa0^Y3KiKhTMRH~!j$rI|Ic(}cvyGD=fB}!W;)z{VWHb~n+jKBIC z10F;3ak)vi-vWF3ICXf%sH8{u+RXs9GopJVTtbHTdn7vuY|s~yZ5il1KzhRGNwB?} zp5KRNO>>Rd7#res)p4kdn5A>VgAF70xNc~nP?js#qXVho73b5PLRl(~=1pE+sWSGn zS59zw8JJg_Xxz_9uYX%APS~@OH{`&pQdLuwBf0IF?*p?vBw4a2ZnJq`bKg81TytmD zqX&{A|D_j&%i$9XAe+4Pz?R5y@`yo5@17XvuAh)VCeXapH*hJe2p>wCX*ROtIbtWr zih~W)iOW(=7ZBtBqfvZmvA8pJ;X*cKKiWs6e1(0_^s6G1BrZoZ{rPI ztTsj7XyQoAJh--E-obsc4Pn75@w=^bVsKPX)Vcbau$#-+e2{=e=hAU`aDs}EHpFFy3j%@o59Qzzh>DP&9Yb-=G3cT7H9e;UJI5B2}# z;Q#X;pDx))s|yr+%kAy$buahgzsm|m|I0)F&o?73P@Y%tDJ{N8P`Nw>Ox`z3I0?L0 zT9h|cTI2y1xbKGTZe~GZW6<-h=MG&|2}cCjrQ}o1bG*HG?A(Tjy(DaI`&_mx0M4BdGr7zu3MZwwxIzq8&TU0RqZSv) z-FpR^&a2h0P2OtUbfl(GPycvVePEc7oU^~X#xVo$2uSSP={;qQ8yUuD(%6+4T6#%T zJ)s6{HmCGFt4vM*mLUYW!I>V{S*}l9x@dN}?Q@*02{irff15A$S=BndqJ)TGPYsuD z$>-&Ziw_nVoe4NDk8>-As6LF$Tc|1Ogb7Pp5CVU?lZX5oW5YQ;K7K{VPP+>)t}Yx` zBC}+P-%i!IN_?IHosOZ;B=XznzmUumw8GAu;9bBocaphAcwdTTwt{Hdmpl#RExxbz zZVBmj^Mgc_x099zqmEqBe~!n?^WHEllcwra({E(Om0K5jQ1?5pXGPpy7Egx8#J35Y zWNGvdd>mb7&`Q>C8k?*X_8giKpcoi80!@M*z&_`|n%Q;fRvu zlE25D&{o6EM4;yFKV8DAl;AQ+Hp5<2XQbpUwj7E>7c}Tc$HL%=Eal zh52Y&R0*-+{KwP;@hKz`nkePFrE{NFr!n5Fn1iAOb}_g5VGCO#C-{b5&0*BK{%Qg$ zd%!T#j-=aQt0p9!)H_qdTJ%l`e}%TZ41E~2-l}`fS6-UwY2pSMpTaIm!~}Ttt%dqi zyP#zAPc5KjVZ(~Kdx+Bpm@OtYdvi9owl>_EN9CA39EWmp!gQEp z;c^gw+3Yk++hG@llSai82meyf9aNUG-&?D(jSR?7WJxo8}&?HG$!axd~2vt zwMt|xcKzqzI8H8R!Nuo?0-hWkAx8D3fa3H9L@oYG_nI40xJ~OOY=qobjYq@xEKuS0 zw6K;CoViNSVCxNK>D#BPjasw>)-lW4uk#$K`C{4eN@w*Ai6I(#f1LV~cEqWdNQ}lM z`X?&pb4EJSp%W{x8QZtX0tD$&f$Cyu9IT@RdM@s@i@^6mnx65F(^-2}>oSc3? z--MT8;flMT1*#Fy+`QoO0ji)s*+zwAfpQz!C`uqbQYlJ;6kaohmbBC!*MO zZl(I$Ey92PvR9aO9`%0KE%$PWcHJ3NF9zK*e80{$XeV*Xf3fjfg%ZKmcKUH-WZ4E; zvByQLncE@`w5e;#YFWlT6%@w2Nl~*pdp6`i6FKJ=2g-K$QaiO9f;B*GpIM2Jx4hN# zto83C3fcAlKuu0so*U=X%zG>_M?Ea<*V@=>uOvf2_e0hnsQd0gE z@6r4FOYaA=?RyE8rxzrgB2D<-(tfOr(L=-KV+rSl+bhxmF^+4s!^Bw@)6;GSR=Pk~ za(K@GHlF4d8*kbbK$;sX{>k;N{w%nf)v2B<$2i$DL`#hr8{^HNvj_eexFxuKlnS}8 z7tFvu*~;7<_o|f3$~e@?SE4(+n&PC31MM{d^TVRF1oroY^%d0dlwQYFrRVVLk0*|+)^!P0IpaLRlxI>DRiwo`#C2VvftEG4y;Q(QNjC-w%9Rl&}re2|S>mq?0&s zALF}saw6Z~vrb1h5N5J@ob~4CZ9x$iNm_$gARl<=CSb)6l_Q~aPa)BAdNL(2G$;`HVllbrdyKFb_YaDdvg%l zgkR}DL_$}n80SwLw%2h1)bf-2s$Z3yCSFzzrhYQ2jT*d< z!u%=nl}ByuHeFxW1sTfb?fC00mx(shbnJ7NqB$ut7!YF{ zQ4yPRK-D%DSM}w6mF3*>TcS&73qCgHYn@2<4IIvEpRB5Wnq#6?VI?p(ncny*^wX7a zNdZWroUFnCh&l=`dbjiQt@MU%UQW8dCl96xa7m>0;QS$;u87_JsIp*AyV?_H{f(AK!=~?iMlr-X#BU*vn%!;9xan znH8W%P7vi+ibu3Bkp2rq1-&#^jjo>cC2Zkob9~qQ<<@JuH6Ymw7fwjh z7>cc2z00em`LDuKsd-!P{-5H&e-0Od+Gv7FgzAmxzC7>3{Nj86O56GUd1~0BoK#fM zg!@4(gr%H-8BqPjnopOxS|#(tN{cg319a_e$8CMJT=k%5Go#1}cO^A>BG}v3`auUd zJDON%EPuwWEF_=XgIoEzN)sDeN6K{1E%SPruy&;WkMTk^iOCiw_0~+%&hEnCpsLku z-yT!LIhp!+Yc#RuMIjantKeQRb;>vuyr*+b0kQ0?vnItumrhu2W6%C1uihf0q1f2S#oJ+A87c*3n&?bdgb8zPTodw79LK-JEIhi?fg?Ym#VJ9ynyUrzK7m=?GJYrGA{Ky|{SE?N}4d&H?dz ze<8!gy_%S^gP%?}Xq@1*9X-6Yzc@4UF_ckDb}DG*r|gTfh+;=w-J)90iNB2$$V5>= zK)V&JF6PGFrY=~T4+FhlD=t**RHoA3pv4SkbhsQjoVM&n@Dv;PSYd`N{h-2ZyKg?l zy3bkTO~wxbyq}-l2Y(GtlSe7tJq-?Z{#2NnXqIlFk#dupGP4}S#ubbhVHO|db@e3D z;o@1y>B}RYbZZ#ri!urMr4O5xB6YM-IW2T4Gx}QkD27WBeQddrhVFu9Lu8Q zMS7{udV7pM`0Ls9;Hu1#D<;aG0cm6%CMTE_?ge;$0&dN)dJ%Wiz{-xOLGHY~f^$qv zu85jqPmER#AQ3I{HOEZ!?Vlr!3T38o)JGAG4I%%e6&G;JcAX&jBP=SAzEt5o3)~ad z6>)#0WB0{!#)WAE_R#!=4^ddJjmd-DJ)^pIZm%24T+F{^?_kHoe;K2g6jdXPJvnwm z^?u4RbGka_g(f{O&^wv70p2oujYL;84%P)N?!+e_)_?Gv`m^`oyB zLCYvDWre4ya-egNH|{u@E@)mid>iTrVf`16{`c{YOcUFx~&Xl0I7)QPQIvSYSWM+dDV#`Os(3 z{BE&-K?r;tDOSKc#+545d?RUx?17xMPG5~6#OVyfwJ$ErK*A9_HyKj%Abjm}eZ6pY zK6_UZ=q__!dR>f2MngR$jD2b%s>9f$?63;;d)PlfD~iz8eC6D&6nD7Z*qpp^hjO&s z&hB2us#NU&i;A99VWDYVX}EFM%R&}D?=8S$Rk3cNmA;kr;E5Z=@uHDkq67m!rR_os zb43cB+22(GpP`iHy4b)9RsD6Wbs4v2QQGkW5+dG}&>4M;8J}ow6k5Fsw#&BtoYHIW zd0H3j&h=i8jwOy7waSPF3i92jSE8peb8}1JzbFq^cE25qa6l1C`S~;L!j3R@xcIHZ z5Y)IQS1cc~;S|!)fLw@Jv$&VeqH9-THYFPB1l<}Ct#zf!5mdzWIzBT)%zC9Ws{nb& zuub6bc<)gZFV{uo%*lxpIR;Z=yoQN|qND!CVOtdu6!})L?lbyKa;*v<(vd(~ zlGi+NDPJf_s|VKf9JHV6KF3;b3bBZ&?HHAj~E`(c(Lwgg%zmzMAUQE0N}85eg@SVSsMWn490KAFTv$5NB5N;dc98C6fjCa z5H4ne?_uO>tS(SV_@QmO_LDUSczrgYd;(3CU8kfx{f6-x3fycWE#=h4)Y;9s<~i;w zkv>BJ{^rSVf8DR2g+wQsjh1X9++0+k^|gtek)%G<3w*m}ik(84LFs4z{x#9#B<0hj zqowXaq<5R)Xam1>;eJb3|0kCKBBUKLVh!#AM;kM1Yla|RynhFfoMG7-8jUABkH>v^ z#XEpiIK>rYy(>t9?gT8Oi_%F6P*G<*UZ2K3UaC)FuyWg4(FLy;w(jsTVQz+X*73#SX>`|K%nS8Km@^C-J*a$0Is)a^ zpD{|d=+>Qjf=5awju9!YPlZ%99 zvmo2x((<;}xR}?~{iXDmBHp(SRIk#K+j{0Ppl-RK5qIiW?EFK%_&lJrW5XPimnpeg z>~+Jwr;C|OB?D!h>2AQ-FLnndo;_P6OZLee2VsZ?CGAkGzt^Zo!qP#nL5=W|Gd7#U zjSL-|8hFGp#`l5;m=yB2X)k?L3Wj}3Q-0R4x(bb;=M%$Gjrd+)$XaIK%8CL;rK%m> z48IZ^GR?C9P~Mmst%TXRs>=6b(nc56p~c3zGeLzSSH)LKH5RPy zr1+Kvu9Jl*`Y&}XsW5}Y6X!J2Xr{kYYk;p11cxm*)M*;|`3g^O)oQYg&$G(>k*Q=k zaBq{BN;W9rLD&!d}Q?whU+WhTFFwkeXhox}Ga=NOZOhYf=)cjmLxQf;l21MAToDsfB%Brk@j zMqb=m;uLe@4P(K3P{4w%AO0|2l;i(R4WqL4MkL)RHU2sOx77WYFTezkpN7m$ z8LEyZocQ^EdL=KXK#12rE->*T)DB%9=V5CeUO z(tjl2$2c1|L+%Fjrg6Kd7Cp*g22zA`oe!=s*a;>1NBNpzj_|^UIOG!(;0*J~tX!AJ zVRWzKwLSX%S?*;|cHh9BHmyc;q~&!N`f4IGJ%x}?yglfVN95Ma)0Hg)?sY8mZ@ax$ z`$IZsQ&t?KMGilRy?+JjeP8k+u9&rC<>K0oBZ0Or-3Rn-B#>6lW~pk`^1^THi)+K5 zOleDUQD5|osZttI_jKnQ@TT@(5qtUjjYN)32-;+kY5c8EZ%6%^B{8;|iNM!Y4w(4_ zx$icF3HQV12}{E$h5d|*q$i*TQMGy^pbzQ-hM=oG8eE<}N6{}_i{ChZpuNIJfmO#$OY!7R7 zqgjIj>>^u|!&iJ`+RGZr(FTq^qp6X2|ETw+c&a_!S)Kirl z`qdz}m#yQu4-pO)RMTG=P?`xpI(%F(X3-BW&*No}FDq9rqJmdJJD9%}aH+}zM>axP9;KQ^% z)y^%uw!wY4P`y`UFluGN7=Q%-!P%|lV&IMRfHAJD_uWzDA074an?}DDk{&Fm@QFGj# z{x?6xGztpQoJ5PDWQ#REUU0_{C(_9mS+QBY;lKM zQ(aY<9TmAYcL|&+{trYeh|G4S^)cjfiG;GCKE^t?G&4H5AKLdu?4`kAf5yT$Bm(@m zBTe*-$#o)(dV0l^jHMsQ6%jtW<`ZQtaZrhtFXK+G>GK+9Y0IJ!V74hOxva1C`IHRF1vM3d>g4fx47#HsMe4x0YcmVj?e9fvBQ#NN2Nj4!wfl`6r@+I zTN(V4Jju(_!ba8r4|MHvfW(Bb+zI_tz=+XWKd41ZMSlAN0?@xXp9- zHbWvSZinjRV?L_p`e#Jr`Jwr!{)X_q|NQf-Z2F!mN)>|k$(|*YR2Y?w8MY6|yWK0t zli)wkYPwH8i_aV$ou1Z_7FA13dHrd(s0?ONQEf_@*!7$uhKwUrRDrN+%^{wwuHj(} z?dEQ0|5vbRbxB)__&p#ogsQI`q#RH1C94;`rB8?xvuRtFOzy7jIbx&4(CkHfPizQEz_qqMiB1VA^O=r~iv& z(Q~`R-Wmg0i|ZN1NUwH#MVt&VF2+C5GVnJg;YFouPqRGokg}8A{#}XKB;Do?cx=~+ zSXO;=APE9!QfrQL^StT>Jm3%r(>}Xo2{{73GapBkz*#W&`Rd&Iigj_)5r^%Bue5;T5(Dv}5d^HP=+}vez|jlBg>GWe%k?dw8^M7wZTWC2 zM59K2uwh#Z04;&qxmGxNYhKlE4Wd%c)#EWdOQCEZZR36&n2hM4cpHnQT2apFyV@YX zg!iC=|7FDd|MVvKrO%ewf;KnrYE8B=F)If(HMR9I=ATW;|LR+vVf9WT8sLr{2;%J! z(e!9CN3&0}C$wR^?b7=jF}yW*%ia4__vX%GS>&*O$LK79jW91is!Mm)6;>SQ(zsji z`e<|WLhYt&Nyo9Lqa}-D(fyU@iBIbIeM4%xFW|95_ooZoLo195!P~5+HY{i|!B-&CN z$jLY>X{eXVdy-^rR+9UGCB9zIH)JOdjvAg;oe(7w_jAo^)z9Sh`^Fd9Fm&QAri={L z&y+1?&=H#jlZo6+@19s>}%es@0S(jopqRJZm)N! zfx2d_IKYY@{(|@KQDi)lmbB}6dkH*&0*1$zsqUKRsxK9H)r(EG(rX+@r@B)-9gL74 zO7!pUel!_95WvKqZkxo(UzzM^Lv9B?!3X=V&Xp7NWLC9jQ*IfP(=vs(@3nk*{+$ZIUh))D%jOpfAKIKd@W5HilmxS}pLl zwmsCf{t4p#Pm0ukeGj4$nP&Xvdv=HPC3tglQ%UUk-Ea?t;}OnpfXZ*S2c~!&uHxbZ z+W59llAM$^)y8jbWClc3u+=a6bKSi@dsuz~8Bzqaz6p65UZpdYlX?gWD~gYwP*Idk zG~Y30k+OrpXOUrEwY@sXM#p0iq0Mn`dS;KlvqMwcD1^Ofe5D=T z?dHC{UU?g63|!-0%lNU4W|a|dwz!|4H#0peN!I=1lH<`uBX7lwC2QBEwA&bR_?-?gtzKwE%;F;nL_Yo_rg|i>D4ysuufZr_Ig!Dh%P0 zNf=j44d;06t0j%48s2^TrqBDX{dVvEGko25alIM(ic&4y4 z$!_Aek`O8u-@{$w+}vLCK2q4khk7hm>pL%XmTG6mC;K@L=1~M-j*)8zm~TlqmBTdL z;H+G$WIA~BgexNNY;}9Q>Kanm=XRGZ!nQppG=8DWV; zYgC#Uj8YY3oFR2(aS9>`L$Oq&`qRQo!OjkjV-;wuRm&uJ@- z=+Ip4vr>u8rXNapw5h$^wmEh5ltd}j){r)omX<7nX(gL$qhr@O;TN+VcZuKxa?JzT zu(Ee*U2KDqW|Fwzx+9f0Wng`;fo4V*dO@4cj%f_@ft?*(R#wk>MvRQbw6#Ll~d_>kYfQ0~? z`yU>)x)XA|vON-DDEk{s@%uylo1gvthBC)zf=P*Kp8K{U@YFu62^`jcC-IkhHUoT8 zTTrBwh=d%*4J?3SEwbb8)Z9FCGV=Ot$y&w<#+GR9LmnZqtk09ZbZ9`({2g^vUs#nm zhd8R2Q*cE;-4gw?ks2S5?{?It*MllzElR0sJu5{v^dgp7#-U;WqnROImerzWq$t$e z-G!@c2A-}W&rsF;0>eG01ZGB2`=}dWD5)U-s ztGdhZKB68#Ew!CTSDpUzX9K6;L^__K%Y+~)WMtp75WPDkGY2(s%ne38n-4jqrgQBl z3;3{S4u+$SNMlC|S8c5hr$1iMdS+c`xzGXd0YjSxc50)aZ zydptY#v}qBQBzjB(&O}P^Qp#)kN)O=DH6X9o-T=f5?4Vp#X)Rbew_&rR*kfjgv)M@ zUN}%xXvJ=GN+*j%IeOZ~MwLy@I@=p+nz_#5GwBk?DM#{`>$8L&^LsVd>WFf>MPvgD z?KAOyqFS7_3c8f-rGaEYqMuF;`jS4=EWa8e3eA>MF?uLH|KV&|G(aC%;E^W;-M>~O z!AsYFJNO_xO$kZNu0LU5N!ec5N~6*%2@!I{Eg`war6UPIr65z_+kTF^x{$0x@0O5L zQS?sd+=FhPM1k4|T;~iQM519s%ZuQJf`be-MatZa#v``^HSU*A#kUa@8*y5K$r~bo zr+g0QWw=h9&rW@5xn{X#Cw)dw!|Nw*21XqjGmZA(Ebjt4mZpL# z{{w!9uiR9t)Y%+JduF(Esl@mnvGhMJdU}MqMGdDDLe24t#-kNeqs3=8Wugw_CD5j4 zKtdKcfo6Q8@ZA&11huP%;?7(9an+O~hydXp2y=H8NJd6x^EfVJxm305*cpR`MijyP ze>nL6!{88=`JMNOyn^~D#=mLzzNPwH8>~_*l!)XTIwj2xPgOsJy&Ge?{kVg!xlEA^g4$(UXBWK)xL zL$PY%DMt0Z+_l<<``uJ-aQOySP@Xz3RJht5r7od$O5Sysd}Kqz+NZchFfPP>*8&j_ zzd5vVllYW$uI5M{yu<~cn#HL@3`9-iprBRLZ)k9F{%T2m*GKH4A4XqQ=k#5j=3^<0a~q2#n6WR=!5QF76;FXnZ4^rrQ^CH0p}x> z;@PqU<9Qfrdy0RK2LC#L{rbSC-#4B3tiSG!iNgwxaxfNC%iOjy=j>yMAIWarXAOos zM0X*I1~VTKJWz2Hf90g;gS5gO7HpGRAFgz6}2fh!FI1gjjrAIK0RA1-Dh zG}B?S8|Lf&ijE|r`V?hMEfn1ZZ6Oc!xw7@|Sjs55sNp%rlx!6k3#M}s>XxkE({H@j z4{0X1yWny+AFV#Vn@XwY6rHwzxLR}wsNOwqu$Ybl{^Emt*?NLxx$1DWG*~*(Ica|{ zoz2=c%z!|pU9}-+A<$e6f<~D>FV^GoGTPd&2s*6D9$iWKY2Xxh@FpI{K(*|Tif6$6 zrU$r>b;7y{QDUEEnu*9Hu>S6c@pGEH_PsL++UZ2JuouIW*ailq(C=Euoh)pjvw?BI z&<5o&#k4`K2!cFaSiI)FxdGuFhQgV(70c^RSzP_t1!^tzx%TfM?@t@mL~4}8o~(gq zmTHhTo5~xlKyw>zZF9#lYn)^L?8gF2*YzHK5shfgCNd%fYxgb>_X6s3Dqcjdbgjo3 zK}U{MBe%hL}I~uhR=+j1=xN3rNbl`&MDLIDK7*CQ+n=vCR+iP&0y{=rnOd#c&txG!7N^ zyjBql2lPxV*h@K7@3_2N>=XF@pekL}_ImH5{q5Z}KEM%A*XfBDt?D?0m#w`NSut?x zjG2?EXmfEXr!guk&_UGpbOW2w?1Z@qL%;a)4b*=bx~lCZYyQE?#IA(+%LPJ)D!ebX z(FAD0{ZgCaczB)ZR?t;E)L=esD%4)b_O%s)_NIIVh+;%L77chUFLFa(J3bR(Q%5sv zjj4UfNsZAH%=XoTkr;pC!Cf%#f}5(l>Xzb?Q6^nVbco|-5x?GV9US2f(P<(&^YM3b z^!s+WyKWuYaBk^9wODRWXOzIa6(m=Uq(nY{Y1#wYNt(Evx5;wefCEL^IKcUsl^o?L z>;!fU2xD|NF3z;|YHM9M-#&m>yZeXX58w!1ix=)-!`Ar`! zo@=P(SO51vRAwtlni2>Z&w@nW;o8Yv=t2V+--o}8`Us-luiIO!cJX@!e#d>8AKW! zjH)y~t<}#v_MG5d-qcvELMq=$ulClMr}8oqMPB!z1Ua}IdPP2Y@+8ZMvM=UK&fY35 zTRBo^Jr*m=xEO=UU0416{k@7BgglE={YFVw(O4qMeNUUP$$a-Ynke1XyQ@t0xH@m* zMehiH+xtmFD=!+m&?i-nCD(6oRAZE#;{B5Nqx`qi`2!u0HNO10v*e%N^nE!B6)-G^ zcGj17xgeNmnDau0?SUsunG~u~dwIQdp;6eW0^d$iGg@6>1Hgl+UdV1o+lvJ^ao2t| zbfbncKh+p=kI1eF0C9IlwL;fAA`7S;?;(x)l>2=bU3AGrL=%SkWCzSqKY}~XYVJSp z;zMFq?w8oOhLrk==S&sAHU5+n^>OO^#jVqeS2SH8VP$U2X0K6W=_XIBzl@d&L_audDVqKf1$kgL24iSW?lVlFNa zW`wxf>)d#pTFYyFx@=1X3+ZnV>N& zL70dBA0zQ2JdnZ#;O+z@BRuEtfmQrLM@?TIi+ zZ>Nyf4%;{?I63iG7n<&mqcL8|agh$4zXK?G92oqnl&PM5c?0ctb935emiUS z*l-e8x@<+HAD46KABM$-YW@UQyXsN-e@tqR$UyPB-wlX49~hY4?x&x3?1IwMQ--ib z=OkfvJ_RiQ>|-zlS(lbLpQ+fFzc)6tjd>t|l{3DID5MVMH2IJ!8h>F) z2X)mTqay>tV{Y+=8>zstM$19!30b^xXLKCu%UWO)!vz;BpcV{s)}FZZh#nT!bFIm> z%o8pYrAjnX#+TPcAeW`zrR@v8cZEykgwQh=6bruvhp$DLfZWz4;yA&cGee_ zyo9;V5#&V_AnVH zz3KEIj4$OJu9vtD%tPH_Rl@i6sW->ZmtlxyvoxyjT*cP>F+Q1Ff5Dni#CGn+^Qka zkG}51N908AWW_l7z-B+a0?H3K6%v;lfU#J~sNQe#6|7e?3aM0Md_&ASk^WR~Uh|GD~PsMUD1AH9m>M~8Jx8A!LeT>KIPIwj%s;Ld-hj?WE+RaRg zE=Od8RdmzFb;q}(|X9v?!C%v#~~kzVUKyLS-ZYDOP)R8>UP(bAUW(Rh^7 z(SGeHZI626x<<9%OdC0UCn#s{P0^y*&BHf8F6OPXXj+Fa9<1Fmwn5Oq&T(b~FWmO*`Cai_-YXX!i%w| z3}L(s4;@RDW3!01l$I>l?^|y#AnAFPqj<@1#R#x4nK>yl5=u+UG%<~*lC+!jGYt)F@N?$1MLE#a z-a|<}#d>5cPeQyK2iaB^kNNN$rjY%JHE=^8O z?zpE>sh1Loia9s*!x>)m@~x7cq;oD50{l~im=ON^_ynz zUs7&_0`0wg0B$tzJ^dhpW4#Kq^x7P|-;x+LGL35b4s)`)t)cXAe z)^2lTv$yN@lbap`#!gLDAP5siMb^}L`GdBz-q}kx^0xhI!RaPi17ljFo?0O?>?P%) z?x^X*G2lzg`yJn}0tnIwoR?Qx`o8G}r|Yv7?7xa1e+v@-lgrQfSP}yg@zSve3(h9n zM2}p996C1tjnxP?q9L@|Sm2$LH$SOza`I%OcPeD2>872AFT(^22z%)!>|a&Rfll(+ zCF7aJiP0T**@6zJz}sM+6Jb?R{{Mg$1*4wv-W_#7MB{vPhCcVn_7zO}%reoNsDodN zk`HaXdWLZR?GhHo(b&f{*}F?l&8Lk+^kq)9iEVyDvE$nODOb%* zu6_+eMYz&p##5awzveb>R)Mi*+okF88`!~oZL0S3r-mGfMXVi4Mw0ko zU_~iI`s%){q21N1PF{~qGABMz(nhQ1XvBkI*%qm5|H>L;w6QT6$}?TAodpRYZR}JO zqYa~p*-?BandNV5YuK!0L9>FlI%iEhPMOD+Ke-${uQB&zi=gW(iXcTNiFp9hANW{7id7p3Z~78j=@ zRqU)kFR#;26Nsm?H#y9jW7V&qFZA^AFetIKh^xfg$43@qNm&*a2&AvR0agkX2TQ}5 zx^4keatC|OmIz+;0C@fsfvkV-+}yZ52yXXl$rdl#QciQQ|M8OUj^PN6$XV@s9YPEO zq8;P6aJahkEn_QVUPSAyo?X4R>u&81G_5ky?-cw#Q&@m?ZhUgcO!kdf*|ijRa0)|? zE0ZRtP^QuF6v7?78H>e!|XHh|ALvkR$x);QA*Et;2|BFM0+{;Z$Q5HK`0dfTuoi299f^mBZPu!YKpy; zdC|uUybBR<7Z;D|dxAW#g8|j)5Izf73#gW?$z^W&N(phQ%7@6^0{WZ){)3(Df8_dt zb6Br2H-%sE6%{>%_0#qb3{Bw-Z`+Sa*s%i>ODN`Cl8ovUzyEst)x-)E!?Z*q`ejYj zSfhZOpIL}2?0R<^(VD_{7}GXu(;sInd`px#!ELr0%5mD%cQ!GR6v$qs0#2?(AaTHp z8>NpS;-GQ@e!Wmr!jG{z_8A$7QwFMvf_M z66VeCZEYx!|3lhWhei2z>nfm>fP#R)5R%dg(jgL3(j7xdcMT;WA&7K$cMTmgba$6@ z4mHx_RK2Wc^F zxE$hBDd*T2RT}qr*#g2_d5Ph53r}|38+a_QiJDL~g(Mvi+=2a#xYXsPE3^}WTVHLX zj(~S_k@s}6KxE{TC`{2>W}EDYAQMU}H|^;#M;a6Pi#qG)K7YigY_c_UTX zDlw&8ZJu+D#gKf7g&{k9eS_~W_f4)cpN@1re=E9j7C8FU!eH3RP&2FWBrjDJ8uO@{ zV+NuSBj=dGzZi-TWvbr3`SJ7?yoMw&1JVebVAA{$xVYg`qh?y($$sPWgLy45#_X|^ zo}3q5$N}GnEZkhuuSN=i4kQkkJ+IdC>b0uR+r8&-!;B(?nu@c(=b4)u^1L1!qoi0W zWf|FM}(M1b_rsyt9_88SZ=?PLa4`kQp5lFC>>#cZ3Sw3biUlfpxIkmGKp_& zX`Y-rH5JJ*%v@U*voUVCsi$0S%wDOk-S36{hMiQ!HS6mK)PS1~2yNwk`i3g<>U_i@ zy3IL5QJ?El)dji*a!$o6{4{FpG0U)|`GP%=VC5+Im6h)=khQsU5Fp1BCK?B~f8xxq zQ`&jVOn0bJ3@4=e56aBb%60V@X=WevnNEC-Pv|sN0HYIPTr0%m8x~fW1V*PHgvm@t zW|hZYeU}|q){Sr7cx3&}uO#v!A5Mf_7QA$`y3q+rB?isE=;h(ovN|O z3G4P|Owuiw21;o>o|I{n&E?53)z3+{=M@rlOiQ#`%z9pc=#TruM!Xah_LE4DZxGW- zS81{1&)~bSn8MU)6}=HnAu9Yg4W6Go(Hk3$X{^?Eg*BllqA!Xl1FP6ZC7X1!7nrm{ zS8|UvDCXaP@?R4r(KD6WW5flSJhLj5m&NfGiU7~66&nRwM`eZQQEIlQ1vczGp7XaC z6bI9Tvk@-lQxd9`3fK(%NO_=2HB_w_*SZ;!V;@p&QV7Wd$b5?6PNl(hjm;{_5qhwx zyw%tcy)<{B_z+c>IQ}21V}E0uzk$}@d17@2l!==(ZRxMEp}TL7zvR(IJ(2m>of*Fs zlL$_%>^a&Gm*pP+NH!~sc^#R;{z&zR?V)~I-8C0|N=DG>O3Vz!_DWV93>; z%bs9Qu0?+nyzZrQ$|Wbqp-s5wbr<54v06T!jbR;^A}J;Q2WJsf;woRMDtnT7X4I6U zc=#9#>(08^h=1T|hV%AE2Fue^JzSkHD7ai>SAMs?ZycO`min*+%JKE?#Msinr|I%1 zncMUvUw%9d|2SSCAwcHf_Gsebg@&z-<@$jz@Q+vMiz3>Bn5@-GNhw0F>(b~-VksC+ zEiEqkAg1cZ%a$yZ5cTaubfRcgJy497%3u_sz&Q?LQk4#%b{A}LM{X>y@b*M(?B3mj zk4##j-pfKJ6pfMY(@H!y{a%)r7kX4i8F_!`gvhvdDtMd|<8P*tl2S+9cQUFN&1|zX z){eL>l2JeHS=(2{H+w62PF=Y774RLUZL|UaqEUTCY}G73#QhKwFgLeUAcH&D(Y!mk zxjxDpy9FL*%*0}1W-b44o)mYuI3QjJ&8J*hoqrbR(1eU0Pm-uQuETUb?449S0WN1q zRrAxY0KfFUmK$bEr8$uoA$^J_gD`PZ&I;p#rdsrDBy4ZdvL}B=hd+(+UpU%7Zz%im zYp3?6fTiPu5pHLkl|P~Aztk1D5{Ui>L7XD8oVS_1TjK2FYmNMVO5ok|1TgIn*yUbC z4&!9wk7*G$0XLU4TGC<@r=%jdgea6mBOBf$bwiQteU07!>r<4)qiNUKzMt7px3}*} zOd?TgP>@Nik7O&p^Fh@D5slulD|9Cg4j3!IpT;@&TV#RrvzA4_aH|OqL~~TvT%2 zmCE>6FH$aPj2sLP>}78?YE&E=Khp++sVMQA?=EZLB+{$L_WYd?#3_bvciYpFCQ|0d zwD(@;-GmfnhDNCa`qjnR`Pw#L@pS%3#}s^=C$|5r?CL z2UdtScgn#cmUES&LVKTIZP4RC*S19@J*gAI_#Dj;7N{XwCGPJgkfC(vV8qe^DgR0R z$c8iRA6fvZq_M{}YaJxBl49Z5Z;G6_Z` z^(sD3+Aa%~Dmw+1Q?#BY!ERy41kZ6h9e8?=3Rk7jIYaDBAE?uqt-Ene?Rl&Mt?qrE ziOK3>Y@YW@!4I#^(}~Gr9^wtI7WLIm`}?0H&IQ0vu!M=!0^_4d4-<8R z`oS8%P-07lU$`ru&UU3u%;A~l6y$1clAVHO>hxgl)a z#tl(HutIhg!i0e)u~+OViKK2kx>DAAW4=Zx{oz zq%T0&G?~&o@nK!xjYl=a-Rfb)UZF^qtB(m3~A8xjH_lp8tesEZg3DcH09jM)Ks z^GxK=`G!dp(b;^4k^yE3MmuY&b2XJ6#hy2_f>?5VSpA%VgI}ib7-hU(K0wjG^rO5{qq#q)JyzPEvW= zDAd6tAT~6~VK_8|(KoL-WPo{j>9I&fQkASr8{{x!upNhA`ZZ%wr@|O=y|-%B+Y^6g z(HC8?Z-a{16om{Yz~6|Fj#?R#Hp+@xfd*WH`auwu^N$FH4c!DQTOzQyAtPvGZW5*D z;b~(zcaxSs+?vZ*&1L#>D#G)CO?SxmqL|+(e?afgxm-*e`J(2d2jPmjX;%JIhk*u`JR?d?DIZhfn3&`Z!K|0 z9I7$%ibD@orZXk3ImzIMOwVu%zd@oAA^E%YK5O+kXGZ=PkymX0CGz_RR{MYWR^1Y1 z;+{MpC?vdfH_$j--d84__wUNp7F=3A`~vG|(jZrikCc;E`A!v;z@$6pC2O{0p&7)cHiU{;3hg*hO+!S3K$?P<=|3oji>Gxihd#rR&zPC(y){f|!LKw<%6!>{OvS353X&NaNM2_D@ny&D z-l=6f!rwkhgOd@bim_tGwV+tbpN}pT#^A9zG?t|dnRX5!J&s7ZFu{)YJWuw}3-+TVXd!h%hGog#|5I}!Hg^!;3h zzIok;wsQsUPWFV%@W?uK1`BE#nc->Yb;G=D?&(So6F%N8IDey?2cFe%eD-LKbgGKo zC1B4oNLm}^KXu~%tKjiAMNcLs`&MJxVXuWDg%C0#6QxetG5d@%YRGik%*`oEsV3#v z7fmRR{!!$+=%*|ek2balwcDR#=(AiSV*91K;xeI`DAtYTxrLRxC!HK>Bb%X(LgP1l z>e+7zd;!dg#f}=Rk+q^UCb&b>@^iFfR?p(OW{*Yi1LJkA`!i-OQGvv|7pV%11J;aa ztWzNqUwS-L@(?OcGU#U3{TFB{#6;-`Rexn0%2gr?iVAxCUTfK*rRVFfB7?AH3Rcp6 zXbhNuNViH+j_;Pder-@+ufIlYm6g)(5m2O5dV8+VaGkYtt@qad+E)8h$o_lAdnX1t z&4PPn5_c_xO($d8zZYUfaEYT)T2lK~ZHN$U>sW^UzvmLmpMK%y8v4wZ_+EHz{*m9` z7NzQ$D58a0YRZ{1-e}4EwocdS5+IFyzOC5pK6l1pXB?dJcvfJ*VbYQ!VbF`DIj!pL zIM!XtpqY;refM5xd&p%G4GkpsRCAHA#a$54W*>HTb{0z9gHMs+N9B#uCM|K~e@6RK zs3+-0QW$qkqK8DvMHh`aoT|!?Z@G>S+ZwXa`0HzT;S5^*xzd zdqv-Q9GbL}CoGF-(6owc=`rufbF{IA#*By#v`0u!zdS%eLc$J+>gwtOt-U5JsMCK# zZj;M+)Kl@2|A8k+oXO~`-J?xKSr)poqff0D2NCKTR6LNtuUvKW{rVJ_fMiCh2tDlr zD;}Y^G;y>TtjAj)u&1&7XY9jw6+OJ6Fyp2^-+MasfMB`Q{+U+$`XVI97}xSPTah`e z3BpC$G8~?l9?KxtuQ8ue(m2?-o&CkL8`pa{>(r&3Y96N*Ue!OPahz(;c;Z>h_(6cu zO#4kQ$@451+$UA&s&I{GWWbJA$fqc!Rt@^=a|oPkn>+2(U0)+=ftg$UMwj@L?IH)q zo^Uq>dK8KW57C4k{Pq7LE~}B8c}x|Ab&p}h!Ci{_LwVPXoFm)46Zha_=qy1<7Eq@# zqVwbl!vjZr%F4=LZzdlb5H1i+2p3n08H_nT4={{fPkRSXlcy0u3R?=gwDXWBX+gzpvFlE!*E*hJ%sn z@akIkwON+Fkp72l{m+lePW(dSyekjH38=!Fp%#rJ$Iayv=v{$&Z)Q1Z&HC^3)q%0j z=)-K1`6La>ikc#@Ssrgo<%9j;nZI6RkE(aQ^ZpL+NrSt^z!mK=zu`;;&xU=4khNq+ zAxxE}s)Z|;!!-nF2smS$y%~5n=Uv_lJ9u716BgEr3+R7XbMsC*qvnQJG2V(o+xgU< zQHK$P;$w+?YWEa8kuyOE)gCgaZ+)=P!q!TmrD4J&s@6s&9H*r)z1jemvF)=Gy%ebxodLx$LDS{?Dn!1elF$Bkv1Sw(>3|Z+&`=xQ7l$slzY^ z-~X4{{;m+rQvQnn4Fzv#8iIOFwWd^Q5|KvJ+tx5SSN9k=2^m+2th?v!d=a z?mO+VWbW=l-E!vKU9rfw|H@HL`F<=6$H~8hX}mgm9FWMjsnt}Im&2k_J7$m*X2X}Q zpM7{P)J6v5p5BPh)HMZ@6l z*5B`J2=TH#Zd#_6@nVbwBx@zcxx~9uA~TQCw`j?HVGJ$5NkXW8(=`{F^WdWq#ja7)cIg+Msob8ly0wAgkFXC-^)>#+Mt=(ff8HxW_z-22_(m4C zZd(5^zjZ<6^l#jO;-gU8CoP7enC_hfsrsQnC4#IQ7`N!wagMJ6TvXeQm-CD$pO!hJFX%M})JP;1!mMAoa#M#b^7tf4QwrCn-VZ~EY=G91V|w`*4J-cFZr2_Bi8k)f*PK^ zkpg!)6vSMsD!hLmJf&!J)-Wfd`|cPQU!&xt#uqieRq*}LiYJhl*Cr|ZQFGWw$*bh? zobh~=f5hLv7QTnudk#RGuV%aF0T_GrP+f^kt&dk=;AN3p>>Qw@jx47Q_ZFJ6=)u4N z$9ubRuuZs5ttJEh(G}B82nCN>6q0OLbI3FZs43_KTX?u#=NHJawBM-0t*@d;SU&*g z_w2+|N}Vq*l8H3zu zE$GF&Pauy8ezsq0p35i5rqQ(Ws@=te>!Noznx(C$&ztS6x6Ip}&-aNP@MEEzU<8-c zP~U4hlHJG3gU2~pGKOCzyrh`xTpW`c^d$lfjxIMSIS6PnUfjtOHWos?&koDQE$D|2 zmgjSQ3`#`%t|}RXf7%7p(7aV^bD%jJ!1yDghpQr?4RKuT_Q6Q{v;J>N{L>fy`YrE|&*X(cjD`7M z$%}&gcCZ;Upt$)YXyc^G8_fVPpF!Ho=A~x0m}s}%BeyLB-P)t@Q2c`svvW>~@VyVb zEn!w1BoY=ET2fdqQoIp)rA#V4Z*#AZepY8Aak{Czc${6F=X~#5kv9N7ds?EQAZvb8 ziKZ0#-ES1lx6bkQY)mQF6RN|=V)X6yS9%AaO)N@B*dt*~yppofUy zLR@dP)pmmB!Slrm!m`M>8j~BVyrb=ZfsAg@QB)ZxMDS&b1F>_|K7_|Z7xvLMgL%QxS+}b~D&~`x1qx0X2svR~1i-%#P0(PcoxTgoY zSUC4a?C8x^UCtCsY&k6nxuNeA% z@!R2aNC)$)60!#DU^DygVB3f9eL>lgMMZKF=Q-$)^T~iZxVK-#?K#oo5XnW*q@8ha zqWU$9<)uxKju3|N}B{> zJ3%ohM&GI(yf_93YovU?V08ERZM=?2&diKL`b`ExAwSgjEBUVWP1yg`W7 z+kzcWNtX*9)e|FXL=y1QO-A%pG+Z+|;-i&s*hK_;?ITg2Bn(Yel z;uPuz0M4UaRid~|ZBx`-+bMntI7%>ugo$LTJ>DeSn6?LUj@rAsQy9zZ@`L&}OHpoi zRAhs3#@2jO6wYZltX7;2IHY=kA42huMk?M(guxmY)YXMaL$|ZB^eSb$rEzq9Wjl}a zv)>!5i^!%3>z^O+d@PJU=6zg5Xxn00;p4zKs2X_|X(tFR$X6b>E zkFcIoluWg2)@41PiZ^je5p*~Jw#A>LR_CT64t)HySn1eoofU@xIEfS$_+LeOOKyavi}$zMItyAgRD6q3*?bJJyx2AZnyd}M|WFYWcu}WVYmOP9n%@e z!Lh>55W2Ri6SqTGQxA)P8UL>lLb>ZuU z92(&?7mvLWbl&E|qN1#bh=}-Va{;bG2G-D-4^S4{lG?cSmmf-hl&9wa^#{_@|0Vh!_3hGP&-v(+7twjjA_X>Oq-pm0>&!( zm=eoLy8WGgWyB##%WIygDa5&`7KtFUY?kKm#qo-$rU?&V+|@~8_N(cSvWSgVbPn8329NQwH>@?G_qV%a~~)4exi#%>j_Y$1B`^ zKyfB_9D*a(;3j;fBMw-sw$}PL%`ZiXvxCWL z98hQlSb&d}jBDia(%Mgkc^nJmq-k&+86OUBpfyue0~L$Tl+^d8C_Gbv@eyz^#-1Cg4%mGR3oORk(`#?;lK zT}y*DxTY0##Ad!1?4(^8uQl^jb(Hv@3444tk9(UGa+^okd|ECydP(jXh;b|fNW^;r z!Se4rLNg+ER`qznQd(aZ8o2gh-AdD~an*JGN_Y+nYZ~i>O3?%NA;U_#x07mh!9Z50 zEl`6+(Mx!)dV+HVr_?EO(3mQqT^0trniq0|eb!M@sys4k8zv<14PC_wI;$60uXc@g zx^@5L_<0lSh-Y$P#9hBtPG@l`m?up=B#G9b5^t_!X*h5&ey`1((P9!PX$s?L- z(&rppiVmJ+Fo)M+UQ?2L31&wui_6+)G!`n%mkbuYdt3@CWt2Bx|JgSlqf40nyk-%w z+4|;r^u5-!@SckW0JE7q3L%7@_<6QMGB2mD22XC(-&OPFDm^~u(sEYH34K_A>*zYe z*#utuoL&*y#5bbvLXI7+1|R!SXo-VM%NSm%%Zca$Mte<^md!Og#FS;CZ4XZuKd6A7W6~puU$QGn+kzXGj$W+GUuZX- zQO`MMinY0&%>{P40>-i!azZgk!!V&B4E)j41azPeLUz{VDvaFc=?F&!C(ic4&7K}pk~n#<_@;wX;%S-T01PDkC5QGnHJ3;5Kwqa12keUiZ5+&J3pVuhIa(pO zXT>=m>))!T=Ny7GYfTKJ*UKwA(|^iz%fiu&xx#kvfYY3tF^uy8ZD-e~F?}(jM zJgBKEM9&K$t(tYlw&0&{#?q$R#;T#k=2ss0pc6-2WGWR924)Gpt-g7*B^g&t0<#4R zo<-Nncg?F6d9K~n;fB?Qj(5XeT`!y5Vo7OWeWwN`AVHq_EDKZcN#0oG#XhNKx9{mR zL0w;Kc^Idq#^;AI4%BrO6kMzZW$Aqk%B)k0^1@m{eafulR;?E7Yoo@WbP~~fE?0x6 zWpZ2ty_!%1m|m_AXSbAlAfsk>p9g8!qGWi{%^zprMIP*Y@%GMd-BUZbtW1{MQJ5uF zQYdPD!x^17C@6z7^)^8EnS{qaKnruhBc9aDcUkvL18TTej4k`LjKs5J?##S2vDtci||$v1D=mu_Gk92`7>?Y|R`y>WLt zktixWV*|as{79OBasTAR>|jutF&Oi=xFyl_1qDffZ>&gK0$6sQ#KXUrGRU`8zBtz^ z2|rRpIu>j={lc=M!-#rtn*oktorXcQ(_F1UcplE_?PX`Wz)2wpBN)frEI-A!Sg}!} zZlQDg4eanMxJc?jfgekAZmt6Qq33NOdM4O71)hB3tP8&K;|{9hvp5 zX-;Qw5j@`>yK_U?w5DgsnY}?G1`Ter`Aft|yf$Bso0f1`OPbpI=6M(V$ufVFxn3|W z?daA-PLc)~AG*)AII`&19O*_At!5GN+M4g(6vG8edF+#15sEj61Q7@!s#Y!3u6<+f zZVvzIt4Ys<`nxIrH~9bG-0%U7f_oZGWdi-*-18TnDgz@y5c%Ozz>YolZr2D{!gTLj ziU^42W1O#JOn_D7V?q&7BmdGjww0>!(HeN4$WAFUy^4<`4wL`(R7^C{DASG~0xqO$ zrl$)vFKe4kY@RBn&NNKiwfzJnNPS1p6~`UJa44FN6YAp^zzLL1mJ1l??(BCI z!>c;tUSf2_9O~mAk2k-fBI<={a6Xl~ZaP@+i}lItxt`OnH6&A9WS(Wr=*H-RYSwzg ztVo|$N0wqdw6ta0K$zw`Tl3#SuC9cA35|_|(T8Fvwj(2PD-bGx!wMaJB>TiE@^^)o zSxz1YdE<+Pk)UYC4)YmGewauYBV{gFYe%owoYX?~8J zh%BL23yMNc;5G15FVX4FpSCHq$)WS-?fulUPicRJPbO6vV;eloa4mfXGv&o+LAhIJr*GM}u?=+krtS=<+{tf&R4 zsQ|@xe7>D7;l3JLpseLA_YXBvrZnZv_sHlV?=xm93o!yzD%S58s zvpAJ?1%x1cROPzh&!2`1wJahE1tzA^`K0OTnipirNhW<6hysV>T!mpPr7}teR{a@B zEJ`E!Ec}bQK+PtSV6BI9zwDLvW=!_U=aLU(8@Ezn6=bcDBkBAXp1Et0WFlxqB7!*U zd@*EVLusE)veMqIy&z#&*iKexBJ8~kpR)fpTy%mxw9wHyXdeo$KI!JBgBr9uqnC84 zlOr)cDwAWjScb~9AYu2{VOU}W>zlE)TeTZSnFQzD3O!RlkFpvPi030>Ig0y-157N}Pp=&vNUDcNaBRzW;ywFmUyrgQuV^pym@la=7o5!1eDj(I%#}TgI9xvB_%oajr?TzM)txUdIvi@M@P(}$yyC9*19)) zN>v$9$5TodtUu!iJ>~1S``PSKR3{aESkSYr+oUswQyM;gHT1y+(7Rp6$#>5WuYG|~ zVzYveKH6Rdp6s{NEu_qoqT1&O;=ii8j%l^Qg-&V}u z-kPRHvCf$t_XcSm^OS+coBLRg?~h%zEXoLI-Xii&d1DPUkdu(6X^D&!E|d}Qmc!raYBMIa^lHH+wt6_!>$r*7KPCU^$7 znXFU>U_nA}Yv&eB?WYuWOlMOff7`(~jRY_ronn6D;mUe9D0;aR73v*7- zw?wPEjBXD6FRA1nk4cZL69O)P;L=|GqtY+^XopDJT=1<160UF@q4--e;>0}a-|_% zegH%tjcJbg8o02iKPQ$$~e~Q)ta}3ORy1ictp;JgxNB@*} zWu@BNavBD60fHskoZH($?blC#AtEX64<}b2m7y6C*1e0a>1tAa}M`t zBk3DB@PKt>V#09%Hl^9Jkqk_vNoXHJYweZBG~C8Rulw+;JMvF2Ae;edY3(UXqpyRJ zWiR&d;HHJTS7!zUH#W~1(N!WMZiyxoQCdVO z4~5KTe-_+eGbi|=q4?fVNHEiHQ_A$nrgl$tJS4yWN5g0-@(e!6oYr%YTCv&}( zQ=njfS$(VZMdDOV3u6n&9JpUu1dq1MGE8kL=zR$sA{V8N^HREK$!$C_sU3=x^K_9k zh|qoF6*Y`=dZn`Vw!T=rS6_r@_*Ob)_}%y8fs>()T_{$;!n5mh9>Aw|h|OG{BO-mD zAMb|DZ7uCBKCz+prmxsx_s7F>&CCj2MT|TUbGGE7VWpf4mcrJaXB&qRFX_?K4OG9DU5nGNZz$O{K9# z`d7g)i&CuW;p?zlLsV!{th+POn54N)6kxSoJxiz5txI{HEwa0s(SOOGQ3~=j>g7_B z4HfPDz=}vANy#h+Sj9O6kn$7zWhT@WhSoZ^6!M_qn1fmT(zst>ie(yKv-^m*>cvDq zoZ%s~LVMlGD5dB0(Hsoq3dmT2uIwfrGe^&rMR;Dc(I2^G1rYz(b+Vp}x8E8Oa6DS4 zmx*C5u4~;L!3kA(?}4R4&eP&cPy!n}zfBt%IS*r&lfV3kho692eT8dBKn z5p|=nl3}Npb6*r-R|9@5Dn&$al{r6_xkFU0{j4AWILAcK@VzzJZ7%l1HXqk+qWe>0 z;G*C25>X3VYXvaRN(7?A_A)^29)1YhxbeGwu5ITlnBm@|X<`1Xs)8D%rXDFtmJSe%gd~d(@wKg&jBk zXv%-^q(hHRX8Yjw6a*qE&X|-JMcg1xh=LAp{#G5F6=GyzKOUO>@?M42= z75$@(38MV)c9t8ge!{Wu0M)Ja_Dysq>i^qZ@^5YsqQykOuBatoFxKC|E+GnfB-}zR zT~#nYcC8=h_GU}NGwex~Hb)*b=N3*e&?N=qoG-L1^9Q0gJQ|ReC zcJ{7En`Aup)T+mY8?3LoiU+u;_O6u2}X ziRz$!4oZQ(=|9X`8Y6WE6_~)+yf;98y9Mx@zpLbWJq|X`8%}ZSAg7Vt2eG zzJ$DK(x>lE&()|s)Wy56o|uiVom+rw#o9rA5+TjbYb=ouOmDycB)W1JG~HH0C&xTR zJ0BlIZJfd%r1OVvIdkn#=k#$MZf-w874d33k7YSMWMu+Sy5W$H(u*qdp5A5*J^%6D zapgVDGZb0bC))(cjFU^c5O2Z8bNrJ$uHl24-O!Ot&nW8nYdioGz15CN$EU`Ao9aE< zbDuC@h5EP7uy!r%Uo`aKDGFn_-iq}2r`9-&yUsV9$s0c>$|~fxo*6LB-H}_r6ZP_h zGntjw9PxDDn=TS9&YLVi zA+j3;&&d2#dPuBY>)oEnhi?3D{O5OE@!upNAyxFPOIlfB-xqG%9 z8N7fjgszQ?IRWzn8amgYxx29Nr0aVUOC*5>8M@HoMu%CsaCf_baboCDTgfbi*kvb z$pzf8t8$z{^pl8muaw85CY@4cr<)5@pw1Me{dW5+7k63-3<8`O(c8D-?)cwg{} z+41f+4rFToCEZ1~JP6?QOl!~bgxD3mT!{QKhvV>VlM2Lql5&R)ZSj`3_PUt{`lLi1 z3?azTY-f)Bbhb*nW}_ZZ{QVqA;D@EuorgfcTg$eb{e5QsHbd}2Hfiz01jIt@UT;?~XtXZXde0!Nl z%dp-8Znox=W5K#kif_m>B9!!Sd+s`1>OjFEmESTtdY6s5$;&OTd`3joS2djjnKfU; zS-*IBJE3WK?cwJ;f69cQ!x!jKzk^teZY~q(TOq=i;EpG(DE)sCGam(H3; zr*rAkIm7OETlTGI!^Z0o=?Mpvb@v zi69kTxWrdoSS2TnA#)e*qDx-&_6F{@MoRFr8|0)j1y5PB+w&IEBie(cD!(!>(_=wF zaMc#CKccZzc$M6S@LV90bsFh5Y*#gHzcQfTVmpd2Y=q7xO`4luE!4R&Hs=)Nq^ z|NK1s#sKXV5?NF0&x;FgnU5dC2aT0{>^YWx64w0B4vJ_92{46fSBx4R}%7}KV|X&3g}NZ-XnA&!rmQvu*JlE9n|7! zb=qJHxxD~vF4B6|x>SW;DN_Z|>wjOz|Hk0O-p*+>OxV{lrwInl-czw+ zo+3qSN6eu2*+^@-(jX45gDr6qDRB>0!z}9q_Db`E z-tw)OafT%g$rRROzYIxE0MMd8n9|%i!rVrrwY*^`9m!WH%!=0rC*j!oNd|0#Vd`RM zUu_)fPEdJ*Wx|exV2`in1X#1YR;{wqkSo@hE0!cF4lTIzHA{~G0iv|TN5yL7isfYJ zqMw&?8{GvI!9BEj$;(3G=!xu^Ke(T2g;8cWr0qis3ktaoHv0o=$wqGLBHH(3P~u9R zd9)Rz1uEI$3s?)Yal-+5Jp4zyykE(sx)&EJqV|mPh8H2i3+U>*%q5viOZHzl31YW6 zWeX&P*$!Rv8O{1sraGJP7wvwSTG*W|sjcnSp-A^T-I}fuAo@|Y_AHaFyVSTyj8@X> zdx*vluR3CAjx_f8GHlUEZzw@=bFvv?M|ivHA0m}sgW}ZRyr7`ev6bb1$F!N^M!;Ij z+FELk5n3J*lS;gop}X-ZK*vP!{LndDZm%J&`4ccx^4xv>1J%cvW8eE3Xu#rZ8Bg2% z1)b!ac=yED;=_foHDD<~VdJD#&5{(5F&qB)QVYW+x9M@>~zSuaO-sWG5w zbU`xr<{*iNwP!!^9q)(nO+Hm{?1%$iKoGG8(Y>=$t5aTxHpP8%2PDO$YU zAg`&j439v$xsW{^wtO20ljsWw#eWZJeLaT&#Ts;ukQjK610Fr7*B;lW=mz+iG^c5q zO=@9f7rdusZH+x?Ju52EPIWR+Fy5fL+S#+Ly*+t*PCkm*ee$vv!n4tV3NesDF!3S| zp8~Rq)x~P_TwPraooAJ&xdb>$+-4>*6OZggXz}s4Kd&8x_l^G)^RE8lW^*n-HxIxk zuy1*d@%w6fKgYAZ;yMGPG!akU%eUEEVh zBtNE#-8Y*Ynly4%2H12j6E53T=blBcrJ|D7=@jLaxaa;X>9}JuGPj)VtHW;=oW-(D zNTR6yMcWyP#x&p57cm?A9RNR{%h}Eq1inOciHrcHMHU$wZ3b8MXP9sK$p!CRx}cE! z=sWvqWaXsN+s`)$mZZsmPHo+Q5Ixvke4NwhI;_$0Ck^$%VNrl*s%%B2-;vV+CvMSt zf<3p3C1zu#E2;+1N4epn_6#zCqW*Yj?q%hE+sP}^QJx-N;&8tgBr4QQnqfz|S2B*R zoFDRBuS04jdbaCbNbYz9r(W18_rJ-WauJt2A>icg+s^?=v*+CCLgu!6SFCCLw2?f;fezA}R>pT+e5aRUeXhsD z)0_&@-c1i@-$xT(YAft+a)*|`uO4akJ(h*O75EU)XCZ82>H;DsMTQEvB2l?@%$&>m7Iq#=^pyn3xcaiHS+z)E4QY(nkgX3K_#h29tzm5p&(7 zfWrR&>`P;!z_AaG_kn`qOT1nPXK^qy0V0!H&gSzw*_cveF3mqjK<*xEZ(zNX0*ja6 zg}We-f|rMT8h#q-X9Z?r<*N%rHgVW0*W&6`R&01{;XOy{_EUWQC$Uaq>;c}pd(OU> z%pV9W-n$&wWS`B0JFI`c5DDYUQUlQ6@v^iFBNN|Lt*!Cm<4nZFq>4bUiAwY zG10LhiSnI)^T9&S6%vSblIB=#5VN>)p2g&lpyiF{|{?l9TwHv_N#=HB7%xEN`r*bjiPjjq%_ho)DR9`g3{6*QqtWGBFz9p z4=LSU1H+u@B`>)TRibm^O%s8c%PLGfzqkUVQ;y%)5FN@HVhg_hA!Z z=vk%s?IECP2mje-dOkTdgMqz8AciglV?MrL#wgeNSWYClQ9)HrZSmW)^!|&{B0?~K zt>#%?-i>9ucwy^F2L3ZkH5^ogE#D+Pt&n2de8Tx|QyFsv2Y+L)629tAV&rBH<0lLc zp0U)5d2O7SrqFTBK0h|BU8@_959vLx%qUXU10Z+fB%FdB(WmfZAk5<+nq)4~a z34MJ&;7UJz7#L5^Nheh?oTSK29@mr_hDn%Wsq$&RdzD>g1y3q&o6}9?0FO-b7Da(o zF&3mAILl~ahJf|QqOU8t?%y4{;N1pB?70z#LvQf&vT|$P6pDDvEv>lE^SNsNL4DOo z*n|=kNE}PIMS6ZZo#Pz=W$sLpM1UC~x4%KiK7rQ&T@7Mm&T70AOq=bz#ek~EAyF2> zoTK|b)K*6Dfz`{MS>JDy$M!>GwLZ@83ZQ=DKL6HEcR6?u*27E?W=}-0jXt()Z50s4 zuz1%hwSw59m zs(=J7akc1IGj;($dL5`Ni99-6j$M-t%}^QO-JjN(lfoj?GGoA6Pv93K`XRP#*YihZ z;8mb3cs1OCI_W>kq7o6;IXqk{X3QAsOocIU#U?(j z4M8Q3XntYy>)4jrx^cj>YQ>n4r*$4#7UdV(Q+TrMaRD^Z3DG^!?}a{JE!41PBH+yo z-McokT=%G=5=gzX5vi)GD?fuU=`=$ki^v75EVQR|Ns)Efs1lUDTndPA=pM0n4M zFUeCZmucH)=JOj=H?k4nF0cS#=Z^*1@u@p0V~ua3aHTu#{>S+AhW=Wm~4S}G}i zj{huLY{V$K_;mJBVkd<rjtkUJ)dH=F^&#fMD55x84k}>>%5DD#anY6vf zSoC%035s{fqV1&K@{7_wR`MaF<5Pk@S_mdoBU6O9EU`6am?siCkV9Q8VswgM3FBNL z>`!lT>-0?-1J3C>=_86;2j}}9(dtDRqh%)zcrZgtXfQZ*E7G%Uk)yHD4$mFA1FGAO z!^QE67Ta5CYcWl>nkz2ITg~5aD}~QLdgfArus0(I4ZK^tCk`<#ha1M4>=(JrO)O?rKvk2{QvHV>G#(-f#3l-|FS_ zlxdf;s-GSVh%v$_XUtPnUI(#aMx?q{(ll5E1=ZMjFnGaTS553?d!aDyt)}{n&`WWjDx5Y$R!hE)l#?z+>cs3jp*hqu1zqzw-kTK zIG4ARJz}l?mbdWqf|xM?o%d3tc=#SpcW_P@`?uEAkoI=lb0?Gx$4=fgoj0aWj?^?G z>0^DIf28a;A|QlK`IjLT|)fB7iwjaE5 z{R{$ksHKQXG|ZmX_Sl=#=xCm&sWy$7>lM?mC|C|jXttTtt#i{sUYITHn=^rT2Hhu! zOkah@R4IGtOzzi6nOR#~yFKjl=H74q(_u!?l(dZFU)62XA^MusU(0$wF>vfAk$zh! z#62wz6sss$EkD-Fhx3aomgzlOwj>WflfjQFmmQu-{|;a zIRifsJGTXiAGX0+tAgmLBK)Cxa+R0I&uUeWJ(){qcR_8?>v@@YQ zp4`jd&IM)PfpR%twoQx9czl{}XwEPS^GfzDLshQcaJPaBPjaqxeDa8dnga6thS$0h zJ!Y}RRDiAHo=KSD)>NIyRWOp_B+4+r4NGd(zE|X>BK|Qg7lvD`)Q4Lv&-CR12LJyR zam6;fV9zi2!S?kN+rXQ!;t}w?5~2`v3PxO9+(}48*pRqj{|B7>9|-vbgZ8Ux5u~@$ zruGKgc$-r2y>KxJoYBUd+-SX*n{M{5uJjj|D9P#CmX~__9-$a} zAAp7CPv7#%f+`Xs6ZLSNCSPOh)6ati;7U2S=}yTBopo$`_$m zqI?LI7m}xZkpz=1OFG~MBA){H$90raCoQt%;XKL^9lDty@C*8K1@3wp) z`EI2v)y+tC2T=R!DWgHnVMAe^u)+aCn--=Pu-M}e3n$^x86WskV6}TCd{XzmjChnUwA^Enxf4sYE!j1iH+q1vS(Fi+$8^W+pKz3*bn zFMQtH1?ybsm@OK10u4r%?BO@S4VTFqsOj21l>MX9UA3n#07moWCDoB*0T?Y)o93${ z8DHjTXwbmlz=hv}kN;s50xz#3px1LWnkf1ibuF5`@)US=VCW+egPEBbws&p!vZUpo zg#YJb4#&6-L=`OO?OC;pK6VmK#Q5!`|AC4~7)osBM07froNCv4Jx`$(^RZH6drt>p zlBw@do#ttJsbq7BLSUnVx;C<5h>Q}@kxxp;HNG1pbfR(Z?!BeR$}drYWL3j%=k#^U zU160nedqSF(;r%E2vcNxAJ&QJT00I}e?5N3udF}`nw^r7FFfY@YH+htF(r*fy*L8O zQ29X5#5Cl#iaT;sPg24!sz*N1-Gd#{aOh2~Q=Pn`&EwI>cst(O0lOl>*=%#H5a=Xz z0vV4^xNuMGY$aTXkW z@8|f=IvdAMN{(oqT>|~N4Np{gWc$&2Xi!4i$Ff%Q!Y7nuRB8F-q1jn(`OV4SX26FY&b|Z}q?7g@h zS}+lJ^+| z0p>0)nvSMDfxTu15BIOsRn-G3=&q2})=HfnvLndv{Pr^q;vuj@2SsUa;lYY{e6C7n zgF5<1CZk3<_a~dUe)=lK_B|u}Z?%6Rf|v>RO}mLfDqT_e1K!Bq?vD=<`BjH*NZS3~ zj_w2L4oaD{1=C&aA-Va3i?#A(bx!(*GejSTFz-}OcLx-{G`Cj;fr;eirW|Wd?l{6y z!Dh2b(0W}Rsd}enVNsr08;#~=@Xq;@#SOj5eL)4S;VI2Y>#~&bWnv3!=45ds*KJ*6 zOv1WzrYmwTfmfQw&V;&h2vjb7_0FS&5`B{b#?;nHf)sd1D$3LT@Fh7a!>UT*%Kb7` zfKBqvBgA8J!;Fir(?HLr$QqlYsgUFgAU);cR-zm$v8VH#SV9HOo971;`$B_QK3|#3ftS;OQ*e{z(1$Ze&ygv8tU3KKcfy!&pEMh;k~%VtwMD zdk(Lz9896;SJA8ybDk<5%2j4q8}0}Ka<9)3@ms`f;|F425yXDgF9Lx&`bl4&t~zoCjKxH%?HB0#~}LPckS(etDzk5jcC z%=a>1j-d`5v#(VW(s~XoOwTxP(^YvT1-Ts|q)8p=uHf=pYQb7>gD+T-iq%lN#TRAu zEBfztfU2`#zcs+Wp_+O3iCoux;MTDiqAywYvOc$JuH|S=vLy6PsycslB$$r%hc0x9 z1uY(B?Q9Ma%aqnaLyv~lcV|Z`)z8?{Ss0joy$Hz@x96aCGxQ}iE!U~Af04!iYHNRe zARP2VAyzq)FUo6O59<^sX46h9H-$#P*5%-KX^Vfmv@ph!X00}7tmUfxt$)tZIU<^< zwkh_AF8tEHd#K!b4Ck7z{(fTsg2@siwUyhw`8jD4XP_?{Tf;C2Bj^78{LOOcCQY?$ z`x9n{qi?;GzBV^m3(wCzmr7d}tt`HzyE;`5k7YkiNZ!f_T2&Z|CstJU^lUEevK!l3 z#jl^);TsS1+?NOH$Gov9KX`U<>C%XbrfwwigoAlPJu_P1ijtB6*-EQ+^(?acdE+dr zg>E|w+xjIr0Xy0aFN95@k=s4;%?e?~SskOZTqg1@Rh7+FENi zxvz2kEbe8xEjx}Z3txaaGbX_u(#bunx!I#>(?Zj2PEh#C3slab{nj(O z5{xEUS}%W9YJ!*7F7Dm|3Uql0_+CsZas1jL^Q*A_jMe^RQvabUpDF+;CX&;bw_@>( z9NgS585EMzTAxjSr6!uw3&!~w-290f35mmhu%5e%i@?523H={b^26SOSFk##A=n)*yrBL1un^IXk%S@Y!CpUZ1Q(LAn-PEd8lFu;AJ4Vz0171!7}qz;%s z&W;i}xYz@wUUfpB^36S=&nyY$>QXwEPlted!E_H_pKHyWgU{yHcQv37=|`&kmSxO} z{8l$~zSZu8+0E!J&hz3-%Z}Q^M5H}!k7+|l^uzNEc|Pk&-omblZrOuv5;Pz|v$3h< z8$3QtMFL?Vw+Bc7nQSfY^+g}o_RstfSKRT=@nZ4Wt zv4J$FmMD4IvGTRWze`5`mpD(jI~rt?*C_Y_+B)6f=;+I8>zPNQ*1F-kHsmgNzqoY2 znq+CBxa8z4#*s zwUfJ=QXDY|?qs=GDg~bMG`O1b0qsQOSDSk-ZKm1XQE%{@FU9d^5Fs0GzDWLw%zX~~8&zl?4e1W=(L02)UdN37387(_MYPzGH{Sdur z?gDehUhp$jgmu>2AY5ukTG|Ksb zBoEy?zre&=7WW62dt=StX~5-;VftUz9{p^z{=9}*xtCx5OpTo{Jw5%}e5)_uzi^L# z#QpJ@QGUzGHaxeg%3ngV^Cm<1wP{SS_lA=Z#9pv_N%rbi8(t7zmzB~f^l<|vdq0$J zwsR#!egsBLs+o|Om_Pf`W<*O_>AC81hl&|@qSOH63AsE&rB|1Y{pHWxjpuzE` zwbtHaKmE45*VT9SD`pA}!X3kh0o{}}&Z5c9XRoy#HCWX)$S6KoCXeFT%v42B)eDHz zL!nS*kR?mMy!FM4?zO=OtY+zZt@yl_gy-e$W z^0FDS&xmxBCqi1loGjQF$6o8a9uw~MPMKTMZ_~OF&`590G2L|+Yu|loN*bR-M2#A2-ejnmL%I}r0aPeUd&^$ zQDvM~?xc^8g0xS=g>fE6>kmf~iSHj6oO5INubQr}^w9z(INF9E&lspEw!=K>lE=a~ zA)at2Z-1VF;bL13qq4UT>D(@M;p~GOY1%mNk{s&4M6|nA##}IOtPT0UK|CKH^~*;{ z=#fpHBUUbWwzGtq6aoo##M;b6osf4MKj)=*xGqv!JZ21RdQP}1<8`3!Vm*Jz@o^=7 zFbcy>c7CdK|N3&0siYmG=XP&z^M#vDT4d9#YvK|_;4Ti|WoKv*7jzcrok)mcbESLW zSQ5De)*T=TVdVRkr;MD`XeQLY6m+|4sIHKik-5P(3e0SRPS?KJb}Ne50(|`L`;xBl zY~kA%cL6+6Wy@!TND1BlHAnJ`e)<)^{svKa)d|+M0k}ab&ujYVxG$d5s2UzQ#YXD; zci+scZ`s@9NEUDmq#3hTRzQqZH;DsoVYkK8 z+-<3eEv>ne`vP`|7nj?J3alqlQ85x$r`o2x{R0CMNjdPZTGirtWlLJ`JXz+!J#IZv zC_|9Yeg5c{xrqPo9oV=9rlQ#KKCFkF^=BF>Hy2pwl_Zh zqZx_fe9%ML(34G}{hQ*miJg4dJL?OS5m1b~?wFyW$3QW(;Cf0x*!FrRa{DIlrtzo0CddH6MrYa21o*rYwx6$Af5<<1|A~E`X3;`~~^e-G{N(T25(30Jn5cTSz zu$>4Qmv;YWB&G1#wYL0aALH$@gfq+hEIaRGwgl>21W^<)N>!$S;>+4WrRLAPx zrvatsu2$15Zm}E#_qk1T#Hx0ce`K|G7Q&M+ME`rM+i%3?pVC3Cg+Y*%$hyn*EuIG$ zxGRp+pPUG&eZ}D$I21omN%;?9dU2-&z6~_dNYe>b*VOR!M8y50*2EG=2(gwS4Rku4 z&twqTE^%u{u=5bXl@bmjFsaOl6fwnbVM9(J4LkU+p~Dp zbL&Tm5Z_*L#M$fax_h@hc?Eey#O8K()0${8RC7tb1QaJi&JoI#p3ZU=eTR1WZGz)x37?K!gvD~2({Em@-1 z9yl>SoKuudquEWZdf*+p%4e&JmUGPL0x|@Jnj?_;3{lhwUb_bcekP(7&kfTQ&r>sqeCV6%*29ehxG_T0R31%odHi^Hm8kDc*NSsZ~W%#M~o}1RirtY6_ z^HaiHwVZ}%+;roMmBmWCD(v_+Pj3jW^HI4*>evRWGI&Jzjzb^cC~nS&U`5A=+}4dX z{JP%#a9Pj-l_ahs8Cjx|?HQ{P^eSxe%LwSG)S>W-?8!|3T>R4EOhu78IQYSvBY|U& z+vSd_xXg=n@?vQCt*mIC{|`V-j5-qI(Ja$qH$$o%3iX}iFUC4fKwJ$bylU<-5ponKlJr$W;PqMK}pCl`CT&7yX6oV zy@2ORQg$6DXc+{r8Vd8gRLQ=Dw+J|}T-Z19@rMTo!~IE1m@!^!&4ceDFxawA7>5M^ zaKb*&zA_oeanDk9@IqHOja5}*!K#(G4AXy9nAF0>i?uxa-L^Ep%C7Dy=d)`50-5J} zWtAT;v^IEQ?)NHj-g`L;nyvxG3HW^!ub#hE9#v|ir7AH0?AmK-u4Tus`li6&LAA{n zv6>{~HKT+t+0X`m!;I?GB1~YR2TJJHC_T6|g1G9X<~Kl{cN@95d&2H)*iJ;fqU*nx z;Zs0da&Urh!7p|fpOLU&mD$o*SlmABTjD@|K&N0=2+KaYiti%Rg56l>?*>~9(-1}{nEdv)@HBwfGV^1 zlHz&jXs#~Mb2>Wr@Q8f|qs%?E%`vg%K3;$W96SUJ4W&-RxZ&aFIi4uL%li!%7*830 z4JFna3tAdZOhvhzXT^5W@}7eCEr}IVSA!10Mw;_@vHbX&dxBk2oQ9fd@tCkSE@*0Y z66QJ90TDkx|02K0ZcVoqm;EsnYAD`>aP3bp<8PdA0x4eaV}v5xA`;p*+|NyiAiDz$ ztwJ>N0=Y!!Q6l=A8k``p49kX5;fMIcQ* zdK@oJ_q8GfU09f$-~%BW^|#7%Ocl@q7OHTenfqL=seTVFUYP#v3uUy!)kEoxy!S9O$S+(kzuv7b4^{=p?v)vv;w@d_G3#@fj%h?KYY=|$jZ7*z!W3C z|K$S~b4vXtl?pCp{%bY$Asr0uJNI#Yj>n>PRJ6aaFf)EgVr_(1$cJT`Cvt&y1mibR z4KNm%^e}m3-?96#eX{uw<#-vKG9I!=G6nbJZk{gNxL*RN1*ckTyFGL{nip_1ngv%=ZVpu@W|Q_elc?zz@p4=?SL53lmGUQ` z*zb@zyU6QapH(JIg(vYf+eyuy@^gw`^FAX2+Mus=i6s00LVf)xmPOJjQXYc|Y84Jm zYgC!J(h+Pr?Mmk(p=uYq=Kb}4iSR)eO?k4yYNijb-};TYT`^tZ1~kx}7X~P&>ac?U-J`vb(=u6%y|VrH)BK z1A@xiwcX%<@9M|asFyJdP>Sa77d2V%&}dloF*Ug{>*N^Uj!QX5b8I^&lxSNTKLZZo zwNeXiCx{D0uK_&QO+Sy9Fz4D=+rKN^ebVzZRRcE(F;knJFC5eUA+bpj^0nXV0X7;A zTZ?NCFrH(TC%ybZ0EQ{NoE5!6q56~$4`#vU(u`BTUSpmD51fYxQX*e9 zZ{pcfWq#UdS;f%q7mtpH9bC|27$&^(w3V^9|1_tFGi*G5mOfGPkfwuvbARM5sQhOHwgvF9UKbl*@;{ciI3BkDCL`oG@@*yC$Jl%m`w;~g5X z9UL6iD#vw|oq2iJKE{sw+5K+)Kd#Z{cpblKIF4_)my(#0l9Ci@qy`Ya1sl6z*L_!h za$Y;OH+QSS8>^_gs-k<7LYMDr(m7Z~7ef6#I*H5RvrIKX64`Zd88s_wVX=-9>+X(~ zvaC*YLcfJ@70<{TjLI$O3e<12ba-pGGHgQ(Yhr>fR=dEfy*MvJ67S7b>vA4OZ~1#4VywIw1hxRKMHfKNJkLrmr=m8DRbDEcvQ|2Rbg!|MU(!E5%M{=G;KlrxpFZO%Kwo);M0Q= z0HdI1e}05EbZ^h4(FJ)tZv1|=>@P_I9Df&{MryZKYQNS(EnBSRl3*s*4`#=~C`gT8 z>t;-IWBsyAY!~#wyPDyu5?ea(9y{xi?MRV(mNMFA|CsC zdrgss#gC8Tb{FDfE<06mzdYisWRyhNwpVIi8m+8SKX#pozj<>43;1C*ufyj4=8HB0^0nC zI=@?6(eS7BCEd)*%DGh&6!T5(9NAv)BqS)P6@X6_xCX=JpSk=N^T8fh0b66?o4Gl< zXCcCVbH@q~&|VK~`yEv+Kzw;#bK~mAB?r8zdY>DyV%Oit^7=)0E=uU?78SX7Y903= z)QxrOIilzUX|%H7&bO8aMZ)5RjLWKGWBj)j!S$7{<2xl!c@(f~LT>%Aeg6yD5gW$Q z)-O70ZdqFM7?>d$@e#B}YEeIM<6%TmInNy;L!^1N=mBGvgGuSO*Ghg!kqehM+gX)2 z__j_V^h4MF%j*35Q<{x8j=LYC8bx#B=Rd?K3_2k$0DiBdx*K5%yMZ$$7P`x4v2EP$>RLN`nYl1MIEInaI(;gRTu) zu+y2i10O{XS)|~+f5VI}H*dww8V|jD>>71a%K<$!PKxndFWGn8nLZ2M!7K36Qgo>k zq6{1E+c?SWHbxUmP9JqV7-9|RWlF>WRS9mDO;VUt2Baj8xW-qgW1?TjY!ErGs}~P* zol1;0*)SH=X11+0uHHB<*XXR~rr^9@JIc^*pFc7=HUhn~I_tPti8neioy`hwZ`Xsm zFRhJgl;}6nDUkP>C7WbsSsX@ z)^Rpq%mKWUc+bH$^%X9tP8{rSoRuFqEeU%F)j+Ymgqxtx8vb`ww z2NlANn<)V)vcV)AGJx=Y_+jvP#vA5Rc^pk|Wr{fd2V4AL6+T)0rhXIGDZf<_3rd^% z^OZ#9MF}O-hb13>eusT_0?2sx85JkZ3+i;tjm^zU*V7%p6m(z7-?7^t*Qkd8*4V(q z#eHu18Tx*o24EN(Ru0I4k^6Tds`1;NXBnS%m{+#pa<7&rK0iqx?D4+&4fjid;1~gJ z9=R0qYU9kON!R(J;YznRL&uEGMU=wK^1Z8OdR0z4NE}XC+m`{0(#mhwlt0UvG4!$M z&lsLAOLn`NaBVPc55Iv>J+MuXAU?GD$VI_k1n^| zbVNPMaA#6J%nE3dRh&abm0RZOoxfg3e=Nm$c+rQ&HsmXk>a@d5Hm{VS%*wzZIo@#0 zyggMdn^h0hxK-sG3(KO3mK+741!dG~*BF&LZBN}BG7@(ee-W?BVLiEr|q$!Fo>VOfH^*rZsN4nSDa#y~!ng`>Eow}cb+jH~%QVSW4_2zUJ|9fsH9!Dyt`;(3UaQcMqb-IN1m^g#QgBo;Z!RkViA^c#|&A|on zJCy|lP}amM|7b0PRCSM~8^*e}DNCH`bspt6e9AD_8p(eRDgnM{1Zrf|JN(~H)DrrJYm3$X1bUfqS%@0VAbtVb8CGW@#0u67h zujcZx3Ku+4G)WmQKNuOiiv&*^qWP%1uRRq$%TIIKo+KNydCXG)Ue3!eR&h>~-Q+E% z8Y38nJ#}cPQ!6YiY`0k5@=eAMFoDJwp-YDPZ3BM5us0H`tw#aG#l^LT-1SVHURC5* zbwCW!Cz6jrtOn2{Ran5@5^JO(gYlr*+v&>F4a7bx!UlQ%vz$XWD}=cTHXF?f$1Z3q zUOeGCRf$A*cT2Z!eoAiL-$yPuDE{SlsO$g2lo8CKbyVr^-3Pz9WTk&m-FNeNKW*+x zul{PWb;2|LVbjb53N$-9{pa9jvnJFb#bL6kr1q`g)?cmAKS)no))E*Bq|QVETQcho zljq%*Tl&c1^fUWNiChP(tK0{49jiC1R#lgq6o=-_(Cxpmx<@qn?j|vo0@Z|6Ra0+twoNKtTpArXwbz94RaLZi%zOeN=yp& zPMfdBi7aL+bPCIJz8JU4RX$G2T6qZ`d0V&w>4jul&EBl+OU}NZKhW20ku0KA7#TRC zCZx8#crf}YwXkSQ4g!NMRiim#JxCzqiQ}6!JG?kby;pA}e4<^zG0B7%d-^zV|Uy#-Q_m?ivi`l}m17YT3Myjm^gJZD#plwH!ZyB0pMx)z7#xAU! zy@7ma%kTU5S8JfJ_{#H#=SPR0jf&nqbsuKv>D5JuUT<4(1-zY=gaQEi_4rP9*YO#XN^IC<9#p4Vi+b`iZ zwGXE#1}V|7U+A^?t$4uQpz9*Ar|Gprt6499Ch0$5A9WUH->L$vUpP?rO}*3hIn%Ay zr8_?%LIC#xWkU6_e%I;p#T*?gEi5b|99{bG{tbBktk=$rkUK^n=8D4M+3+rIrRy~?>7I!x+Ue0L)hs_*^ zYxjd1$I@Tr9XqWPt71K3#0|`0X*Sb*0ja1j;~`U}jyZMp^#L%s;?9`6A>&0ztmWGnk4~tB20bTiw6qda z&SEc&EO&zWVtk~$cf9nVW@jFOA80+U_ zeytApyd&=0@#l=VKyUl@bS?Ost@LcpZ~89lsIz10IW^(46XZ^iYWA zPzwSx6iwiOuA)oALFe+VnkOtDDo$Rc5O)7-7Jyl@+w9sUywqV5)56jwY|V3HiD|0F zK=}m(>O)~;H5|k4sl4OAlF}ix`*2S}IawDZG@G&X6-Gj=O;_JeqC{DU#=>!$9IF6p zo;@)LVJDy5y=`P_x;a(dEYC9Q^1kOb)!^8+mOrvSq5oD<-$H*TWjBqOt@S}eOdoA1CSW{9hKBBR(ioZjwUNy%`k6>AwV3zWbu%}M zJ)yNM^im-ONpc~ql$>8U<`IUsHa50Gdu|rmj)v~cqGGnT4-#FY;*N&Fk2~ewtu?t) zMl=cv7z#)_q$jK2`0kr!uu!_=!$7b}gh|%LSf=SgdS}IaRBH zv`a*z4r*tel*WQus#YwbtH)2v0v`PhBmRyG|GegHM8q*CV;9F?Xg`6hU!7~(=mgv7 zRdP(Obh!~o(R%NCqArN~-g%m;DLx8GEPeDF(@0z7RogtY47gmk8Fp?y;Qv{8X(Pps zcDmx_nENoj8F4ErD!w!{2nDhZ-~IWaKZ*1Utro=NIfPs)<`4FopGMO=?}?3yj)v?6 z?rXQxFNgK3Uez=_d%wan#+~0-d71`KmplC~%RXGX*!c*bLXS_kxVcW`b3?HYvc7ku zX2tY1^`Lrm6r0WI#Zi72=EU)Py?S{zqce|1iyS!Fa7jsVwcCkQ%+ z7B#IfH-eYp+#avfPbeS5#wfImo02#(d7vU)*5xb=!s_+TTS_4~MwGc7+fFRw7$^kt z>H`~YX9%n{(D%+V@}3Yfh+(9%@^dru*5<>#*r}(L7mdO)?*f13)xT!SKb;75_z@Zp z(sw2sbf`XekWuSA{Zw#$wHM>g2l49x?fYQPg719fq~gziCoR_AipY5^(X&_fik~Kb z4seM*!Uob<*u{i~a%SE@BUYR%5g7d4&*Kh>&|eWpY#4|YEo-H&|09N&q@|yPQ`N8> z15K%an=}TLppdF_slBOv<4bBFYnZP|nn7G<9n!w@6sM{2ag~=&tA0tWusbp65-vMT z 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

Nb%#nL@U{v1&%=d}J{nj_j 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�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

=@{SG?#^-)m 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%0A<2m98d`t~PKvjG30lW(w$Zk{ZSnQP4rs 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 LMConfig: + llm_config = LMConfig( + provider=args.provider, model=args.model, mode=args.mode, cuda=args.cuda + ) + if args.provider == "openai": + llm_config.gen_config["temperature"] = args.temperature + llm_config.gen_config["top_p"] = args.top_p + llm_config.gen_config["context_length"] = args.context_length + llm_config.gen_config["max_tokens"] = args.max_tokens + llm_config.gen_config["stop_token"] = args.stop_token + llm_config.gen_config["max_obs_length"] = args.max_obs_length + llm_config.gen_config["max_retry"] = args.max_retry + elif args.provider == "huggingface": + llm_config.gen_config["temperature"] = args.temperature + llm_config.gen_config["top_p"] = args.top_p + llm_config.gen_config["max_new_tokens"] = args.max_tokens + llm_config.gen_config["stop_sequences"] = ( + [args.stop_token] if args.stop_token else None + ) + llm_config.gen_config["max_obs_length"] = args.max_obs_length + llm_config.gen_config["model_endpoint"] = args.model_endpoint + llm_config.gen_config["max_retry"] = args.max_retry + elif args.provider == "anthropic": + llm_config.gen_config["max_obs_length"] = None + llm_config.gen_config["max_retry"] = args.max_retry + else: + raise NotImplementedError(f"provider {args.provider} not implemented") + return llm_config diff --git a/llms/providers/anthropic_utils.py b/llms/providers/anthropic_utils.py new file mode 100644 index 0000000..754c77f --- /dev/null +++ b/llms/providers/anthropic_utils.py @@ -0,0 +1,45 @@ +# Use the native inference API to send a text message to Anthropic Claude. + +import boto3 +import json + +def generate_from_anthropic_completion( + prompt: str, + engine: str, +) -> str: + # Create a Bedrock Runtime client in the AWS Region of your choice. + client = boto3.client("bedrock-runtime", region_name="us-east-1") + + # Set the model ID, e.g., Claude 3 Haiku. + model_id = "anthropic.claude-3-sonnet-20240229-v1:0" + + # Format the request payload using the model's native structure. + native_request = { + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 1024, + "temperature": 0.5, + "messages": [ + { + "role": "user", + "content": [{"type": "text", "text": prompt}], + } + ], + } + + # Convert the native request to JSON. + request = json.dumps(native_request) + + try: + # Invoke the model with the request. + response = client.invoke_model(modelId=engine, body=request) + + except Exception as e: # (ClientError, Exception) as e: + raise KeyError(f"ERROR: Can't invoke '{engine}'. Reason: {e}") + + # Decode the response body. + model_response = json.loads(response["body"].read()) + + # Extract and print the response text. + response_text = model_response["content"][0]["text"] + + return response_text \ No newline at end of file diff --git a/llms/providers/hf_utils.py b/llms/providers/hf_utils.py new file mode 100644 index 0000000..b5e8987 --- /dev/null +++ b/llms/providers/hf_utils.py @@ -0,0 +1,21 @@ +from text_generation import Client # type: ignore + + +def generate_from_huggingface_completion( + prompt: str, + model_endpoint: str, + temperature: float, + top_p: float, + max_new_tokens: int, + stop_sequences: list[str] | None = None, +) -> str: + client = Client(model_endpoint, timeout=60) + generation: str = client.generate( + prompt=prompt, + temperature=temperature, + top_p=top_p, + max_new_tokens=max_new_tokens, + stop_sequences=stop_sequences, + ).generated_text + + return generation diff --git a/llms/providers/openai_utils.py b/llms/providers/openai_utils.py new file mode 100644 index 0000000..fb86d52 --- /dev/null +++ b/llms/providers/openai_utils.py @@ -0,0 +1,283 @@ +"""Tools to generate from OpenAI prompts. +Adopted from https://github.com/zeno-ml/zeno-build/""" + +import asyncio +import logging +import os +import random +import time +from typing import Any + +import aiolimiter +import openai +from openai import OpenAI +from tqdm.asyncio import tqdm_asyncio + + +def retry_with_exponential_backoff( # type: ignore + func, + initial_delay: float = 1, + exponential_base: float = 2, + jitter: bool = True, + max_retries: int = 3, + errors: tuple[Any] = (openai.RateLimitError,), +): + """Retry a function with exponential backoff.""" + + def wrapper(*args, **kwargs): # type: ignore + # Initialize variables + num_retries = 0 + delay = initial_delay + + # Loop until a successful response or max_retries is hit or an exception is raised + while True: + try: + return func(*args, **kwargs) + # Retry on specified errors + except errors as e: + # Increment retries + num_retries += 1 + + # Check if max retries has been reached + if num_retries > max_retries: + raise Exception( + f"Maximum number of retries ({max_retries}) exceeded." + ) + + # Increment the delay + delay *= exponential_base * (1 + jitter * random.random()) + print(f"Retrying in {delay} seconds.") + # Sleep for the delay + time.sleep(delay) + + # Raise exceptions for any errors not specified + except Exception as e: + raise e + + return wrapper + + +async def _throttled_openai_completion_acreate( + engine: str, + prompt: str, + temperature: float, + max_tokens: int, + top_p: float, + limiter: aiolimiter.AsyncLimiter, +) -> dict[str, Any]: + async with limiter: + for _ in range(3): + try: + return await openai.Completion.acreate( # type: ignore + engine=engine, + prompt=prompt, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + ) + except openai.RateLimitError: + logging.warning( + "OpenAI API rate limit exceeded. Sleeping for 10 seconds." + ) + await asyncio.sleep(10) + except openai.APIError as e: + logging.warning(f"OpenAI API error: {e}") + break + return {"choices": [{"message": {"content": ""}}]} + + +async def agenerate_from_openai_completion( + prompts: list[str], + engine: str, + temperature: float, + max_tokens: int, + top_p: float, + context_length: int, + requests_per_minute: int = 300, +) -> list[str]: + """Generate from OpenAI Completion API. + + Args: + prompts: list of prompts + temperature: Temperature to use. + max_tokens: Maximum number of tokens to generate. + top_p: Top p to use. + context_length: Length of context to use. + requests_per_minute: Number of requests per minute to allow. + + Returns: + List of generated responses. + """ + if "OPENAI_API_KEY" not in os.environ: + raise ValueError( + "OPENAI_API_KEY environment variable must be set when using OpenAI API." + ) + openai.api_key = os.environ["OPENAI_API_KEY"] + openai.organization = os.environ.get("OPENAI_ORGANIZATION", "") + limiter = aiolimiter.AsyncLimiter(requests_per_minute) + async_responses = [ + _throttled_openai_completion_acreate( + engine=engine, + prompt=prompt, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + limiter=limiter, + ) + for prompt in prompts + ] + responses = await tqdm_asyncio.gather(*async_responses) + return [x["choices"][0]["text"] for x in responses] + + +@retry_with_exponential_backoff +def generate_from_openai_completion( + prompt: str, + engine: str, + temperature: float, + max_tokens: int, + top_p: float, + stop_token: str | None = None, +) -> str: + if "OPENAI_API_KEY" not in os.environ: + raise ValueError( + "OPENAI_API_KEY environment variable must be set when using OpenAI API." + ) + openai.api_key = os.environ["OPENAI_API_KEY"] + openai.organization = os.environ.get("OPENAI_ORGANIZATION", "") + response = OpenAI().completions.create( # type: ignore + prompt=prompt, + engine=engine, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + stop=[stop_token], + ) + answer: str = response["choices"][0]["text"] + return answer + + +async def _throttled_openai_chat_completion_acreate( + model: str, + messages: list[dict[str, str]], + temperature: float, + max_tokens: int, + top_p: float, + limiter: aiolimiter.AsyncLimiter, +) -> dict[str, Any]: + async with limiter: + for _ in range(3): + try: + return await openai.ChatCompletion.acreate( # type: ignore + model=model, + messages=messages, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + ) + except openai.RateLimitError: + logging.warning( + "OpenAI API rate limit exceeded. Sleeping for 10 seconds." + ) + await asyncio.sleep(10) + except asyncio.exceptions.TimeoutError: + logging.warning("OpenAI API timeout. Sleeping for 10 seconds.") + await asyncio.sleep(10) + except openai.APIError as e: + logging.warning(f"OpenAI API error: {e}") + break + return {"choices": [{"message": {"content": ""}}]} + + +async def agenerate_from_openai_chat_completion( + messages_list: list[list[dict[str, str]]], + engine: str, + temperature: float, + max_tokens: int, + top_p: float, + context_length: int, + requests_per_minute: int = 300, +) -> list[str]: + """Generate from OpenAI Chat Completion API. + + Args: + messages_list: list of message list + temperature: Temperature to use. + max_tokens: Maximum number of tokens to generate. + top_p: Top p to use. + context_length: Length of context to use. + requests_per_minute: Number of requests per minute to allow. + + Returns: + List of generated responses. + """ + if "OPENAI_API_KEY" not in os.environ: + raise ValueError( + "OPENAI_API_KEY environment variable must be set when using OpenAI API." + ) + openai.api_key = os.environ["OPENAI_API_KEY"] + openai.organization = os.environ.get("OPENAI_ORGANIZATION", "") + limiter = aiolimiter.AsyncLimiter(requests_per_minute) + async_responses = [ + _throttled_openai_chat_completion_acreate( + model=engine, + messages=message, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + limiter=limiter, + ) + for message in messages_list + ] + responses = await tqdm_asyncio.gather(*async_responses) + return [x["choices"][0]["message"]["content"] for x in responses] + + +@retry_with_exponential_backoff +def generate_from_openai_chat_completion( + messages: list[dict[str, str]], + model: str, + temperature: float, + max_tokens: int, + top_p: float, + context_length: int, + stop_token: str | None = None, +) -> str: + if "OPENAI_API_KEY" not in os.environ: + raise ValueError( + "OPENAI_API_KEY environment variable must be set when using OpenAI API." + ) + openai.api_key = os.environ["OPENAI_API_KEY"] + openai.organization = os.environ.get("OPENAI_ORGANIZATION", "") + + response = OpenAI().chat.completions.create( # type: ignore + model=model, + messages=messages, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + stop=[stop_token] if stop_token else None, + ) + answer: str = response.choices[0].message.content + return answer + + +@retry_with_exponential_backoff +# debug only +def fake_generate_from_openai_chat_completion( + messages: list[dict[str, str]], + model: str, + temperature: float, + max_tokens: int, + top_p: float, + context_length: int, + stop_token: str | None = None, +) -> str: + if "OPENAI_API_KEY" not in os.environ: + raise ValueError( + "OPENAI_API_KEY environment variable must be set when using OpenAI API." + ) + openai.api_key = os.environ["OPENAI_API_KEY"] + openai.organization = os.environ.get("OPENAI_ORGANIZATION", "") + answer = "Let's think step-by-step. This page shows a list of links and buttons. There is a search box with the label 'Search query'. I will click on the search box to type the query. So the action I will perform is \"click [60]\"." + return answer diff --git a/llms/tokenizers.py b/llms/tokenizers.py new file mode 100644 index 0000000..9883ed1 --- /dev/null +++ b/llms/tokenizers.py @@ -0,0 +1,29 @@ +from typing import Any + +import tiktoken +from transformers import LlamaTokenizer # type: ignore + + +class Tokenizer(object): + def __init__(self, provider: str, model_name: str) -> None: + if provider == "openai": + self.tokenizer = tiktoken.encoding_for_model(model_name) + elif provider == "huggingface": + self.tokenizer = LlamaTokenizer.from_pretrained(model_name) + # turn off adding special tokens automatically + self.tokenizer.add_special_tokens = False # type: ignore[attr-defined] + self.tokenizer.add_bos_token = False # type: ignore[attr-defined] + self.tokenizer.add_eos_token = False # type: ignore[attr-defined] + elif provider == "anthropic": + pass + else: + raise NotImplementedError + + def encode(self, text: str) -> list[int]: + return self.tokenizer.encode(text) + + def decode(self, ids: list[int]) -> str: + return self.tokenizer.decode(ids) + + def __call__(self, text: str) -> list[int]: + return self.tokenizer.encode(text) diff --git a/llms/utils.py b/llms/utils.py new file mode 100644 index 0000000..cf3cc52 --- /dev/null +++ b/llms/utils.py @@ -0,0 +1,67 @@ +import argparse +from typing import Any +from transformers import AutoTokenizer, AutoModel + +from llms import ( + generate_from_huggingface_completion, + generate_from_openai_chat_completion, + generate_from_openai_completion, + lm_config, +) + +APIInput = str | list[Any] | dict[str, Any] + +model = None +tokenizer = None + +def call_llm( + lm_config: lm_config.LMConfig, + prompt: APIInput, +) -> str: + global model + global tokenizer + + response: str + + if lm_config.provider == "openai": + if lm_config.mode == "chat": + assert isinstance(prompt, list) + response = generate_from_openai_chat_completion( + messages=prompt, + model=lm_config.model, + temperature=lm_config.gen_config["temperature"], + top_p=lm_config.gen_config["top_p"], + context_length=lm_config.gen_config["context_length"], + max_tokens=lm_config.gen_config["max_tokens"], + stop_token=None, + ) + elif lm_config.mode == "completion": + assert isinstance(prompt, str) + response = generate_from_openai_completion( + prompt=prompt, + engine=lm_config.model, + temperature=lm_config.gen_config["temperature"], + max_tokens=lm_config.gen_config["max_tokens"], + top_p=lm_config.gen_config["top_p"], + stop_token=lm_config.gen_config["stop_token"], + ) + else: + raise ValueError( + f"OpenAI models do not support mode {lm_config.mode}" + ) + elif lm_config.provider == "huggingface": + assert isinstance(prompt, str) + response = generate_from_huggingface_completion( + prompt=prompt, + model_endpoint=lm_config.gen_config["model_endpoint"], + temperature=lm_config.gen_config["temperature"], + top_p=lm_config.gen_config["top_p"], + stop_sequences=lm_config.gen_config["stop_sequences"], + max_new_tokens=lm_config.gen_config["max_new_tokens"], + ) + else: + raise NotImplementedError( + f"Provider {lm_config.provider} not implemented" + ) + + return response diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f85e701 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +lxml +torch +ctranslate2 +boto3 +accelerate +bitsandbytes +peft +matplotlib +google +google-generativeai +google-ai-generativelanguage \ No newline at end of file diff --git a/scripts/run_config.sh b/scripts/run_config.sh new file mode 100644 index 0000000..44d095e --- /dev/null +++ b/scripts/run_config.sh @@ -0,0 +1,11 @@ +export SHOPPING="http://:7770" +export SHOPPING_ADMIN="http://:7780/admin" +export REDDIT="http://:9999" +export GITLAB="http://:8023" +export MAP="http://:3000" +export WIKIPEDIA="http://:8888/wikipedia_en_all_maxi_2022-05/A/User:The_other_Kiwix_guy/Landing" +export HOMEPAGE="http://:4399" +export OPENAI_API_KEY= +conda activate webarena +python browser_env/auto_login.py +python eval_webarena.py --config AgentOccam/configs/AgentOccam.yml \ No newline at end of file diff --git a/scripts/run_webarena.sh b/scripts/run_webarena.sh new file mode 100644 index 0000000..b318292 --- /dev/null +++ b/scripts/run_webarena.sh @@ -0,0 +1,6 @@ +python webarena_replication.py \ + --instruction_path webarena/agent/prompts/jsons/p_cot_id_actree_2s.json \ + --test_start_idx 65 \ + --test_end_idx 66 \ + --model gpt-4-turbo \ + --result_dir ../AgentOccam-Trajectories/WebArena-replication \ No newline at end of file diff --git a/webagents_step/__init__.py b/webagents_step/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webagents_step/agents/agent.py b/webagents_step/agents/agent.py new file mode 100644 index 0000000..4a0670b --- /dev/null +++ b/webagents_step/agents/agent.py @@ -0,0 +1,106 @@ +from typing import List + + +class Agent: + def __init__( + self, + max_actions, + verbose=0, + logging=False, + previous_actions: List = None, + previous_reasons: List = None, + previous_responses: List = None, + ): + self.previous_actions = [] if previous_actions is None else previous_actions + self.previous_reasons = [] if previous_reasons is None else previous_reasons + self.previous_responses = [] if previous_responses is None else previous_responses + self.max_actions = max_actions + self.verbose = verbose + self.logging = logging + self.trajectory = [] + self.data_to_log = {} + + def reset(self): + self.previous_actions = [] + self.previous_reasons = [] + self.previous_responses = [] + self.trajectory = [] + self.data_to_log = {} + + def get_trajectory(self): + return self.trajectory + + def update_history(self, action, reason): + if action: + self.previous_actions += [action] + if reason: + self.previous_reasons += [reason] + + def predict_action(self, objective, observation, url=None): + pass + + def receive_response(self, response): + self.previous_responses += [response] + + def act(self, objective, env): + while not env.done(): + observation = env.observation() + action, reason = self.predict_action( + objective=objective, observation=observation, url=env.get_url() + ) + status = env.step(action) + + if self.logging: + self.log_step( + objective=objective, + url=env.get_url(), + observation=observation, + action=action, + reason=reason, + status=status, + ) + + if len(self.previous_actions) >= self.max_actions: + print(f"Agent exceeded max actions: {self.max_actions}") + break + + return status + + async def async_act(self, objective, env): + while not env.done(): + observation = await env.observation() + action, reason = self.predict_action( + objective=objective, observation=observation, url=env.get_url() + ) + status = await env.step(action) + + if self.logging: + self.log_step( + objective=objective, + url=env.get_url(), + observation=observation, + action=action, + reason=reason, + status=status, + ) + + if len(self.previous_actions) >= self.max_actions: + print(f"Agent exceeded max actions: {self.max_actions}") + break + + return status + + def log_step(self, objective, url, observation, action, reason, status): + self.data_to_log['objective'] = objective + self.data_to_log['url'] = url + self.data_to_log['observation'] = observation if isinstance(observation, str) else observation["text"] + self.data_to_log['previous_actions'] = self.previous_actions[:-1] + self.data_to_log['previous_responses'] = self.previous_responses[:-1] + self.data_to_log['previous_reasons'] = self.previous_reasons[:-1] + self.data_to_log['action'] = action + self.data_to_log['reason'] = reason + if status: + for (k, v) in status.items(): + self.data_to_log[k] = v + self.trajectory.append(self.data_to_log) + self.data_to_log = {} diff --git a/webagents_step/agents/prompt_agent.py b/webagents_step/agents/prompt_agent.py new file mode 100644 index 0000000..ced63b3 --- /dev/null +++ b/webagents_step/agents/prompt_agent.py @@ -0,0 +1,59 @@ +from webagents_step.agents.agent import Agent +from typing import List +from webagents_step.utils.llm import fill_prompt_template, construct_llm_message_openai, call_openai_llm, parse_action_reason, calculate_cost_openai, call_anthropic_llm + +class PromptAgent(Agent): + def __init__(self, max_actions: int = 10, verbose: bool = False, logging: bool = False, + debug: bool = False, prompt_template: str = None, model: str = "gpt-3.5-turbo", + prompt_mode: str = "chat", previous_actions: List = None, previous_reasons: List = None, previous_responses: List = None): + super().__init__(max_actions=max_actions, verbose=verbose, logging=logging, previous_actions=previous_actions, previous_reasons=previous_reasons, previous_responses=previous_responses) + self.debug = debug + self.prompt_template = prompt_template + self.model = model + self.prompt_mode = prompt_mode + + def previous_history(self): + previous_history = [] + + if len(self.previous_actions) == len(self.previous_responses): + for action, response in zip(self.previous_actions, self.previous_responses): + if response: + previous_history.append(f"{response} = {action}") + else: + previous_history.append(action) + previous_history="\n".join(previous_history) + else: + previous_history = "\n".join(action for action in self.previous_actions if action is not None) if self.previous_actions is not None else "" + + + return previous_history + + def predict_action(self, objective, observation, url=None): + prompt = fill_prompt_template(prompt_template=self.prompt_template, objective=objective, + observation=observation, url=url, + previous_history=self.previous_history()) + messages = construct_llm_message_openai(prompt=prompt, prompt_mode=self.prompt_mode) + model_response = call_openai_llm(messages=messages, model=self.model) + action, reason = parse_action_reason(model_response) + + if self.logging: + self.data_to_log['prompt'] = messages + + if self.verbose > 0: + print(f"\n OBJECTIVE: {objective}") + print(f"\n URL: {url}") + print(f"\n PREVIOUS HISTORY: {self.previous_history()}") + print(f"\n REASON: {reason}") + print(f"\n ACTION: {action}") + if self.verbose > 1: + print(f"\n OBSERVATION: {observation}") + print(f"\n RESPONSE: {model_response}") + + if self.debug: + human_input = input() + if human_input != "c": + action = human_input + reason = "None" + + self.update_history(action=action, reason=reason) + return action, reason \ No newline at end of file diff --git a/webagents_step/agents/step_agent.py b/webagents_step/agents/step_agent.py new file mode 100644 index 0000000..bd3482c --- /dev/null +++ b/webagents_step/agents/step_agent.py @@ -0,0 +1,105 @@ +from webagents_step.agents.agent import Agent +from webagents_step.utils.stack import Stack +from webagents_step.agents.prompt_agent import PromptAgent + +from typing import List, Dict +import re +import time + +class StepAgent(Agent): + def __init__(self, max_actions: int = 10, verbose: bool = False, logging: bool = False, + debug: bool = False, + root_action: str = None, + action_to_prompt_dict: Dict = None, + low_level_action_list: List = None, + model: str = "gpt-3.5-turbo", + prompt_mode: str = "chat", previous_actions: List = None): + super().__init__(max_actions=max_actions, verbose=verbose, logging=logging, previous_actions=previous_actions) + self.debug = debug + self.root_action = root_action + self.action_to_prompt_dict = {} if action_to_prompt_dict is None else action_to_prompt_dict + self.low_level_action_list = [] if low_level_action_list is None else low_level_action_list + self.model = model + self.prompt_mode = prompt_mode + self.stack = Stack() + + def is_done(self, action): + if action and "stop" in action: + return True + return False + + def is_low_level_action(self, action): + if not action: + return False + action_type = action.split()[0] + return (action_type in self.low_level_action_list) + + def is_high_level_action(self, action): + if not action: + return False + action_type = action.split()[0] + return (action_type in self.action_to_prompt_dict) + + def init_root_agent(self, objective): + root_prompt_template = self.action_to_prompt_dict[self.root_action] + agent = PromptAgent( + prompt_template=root_prompt_template, + model=self.model, + prompt_mode=self.prompt_mode, + max_actions=self.max_actions, + verbose=self.verbose, + logging=self.logging, + debug=self.debug, + previous_actions=[], + previous_reasons=[], + previous_responses=[] + ) + return {'agent': agent, 'objective': objective} + + def init_agent(self, action): + pattern = r'(\w+)\s+\[(.*?)\]' + matches = re.findall(pattern, action) + action_type, _ = matches[0] + objective = action + prompt_template = self.action_to_prompt_dict[action_type] + agent = PromptAgent( + prompt_template=prompt_template, + model=self.model, + prompt_mode=self.prompt_mode, + max_actions=self.max_actions, + verbose=self.verbose, + logging=self.logging, + debug=self.debug, + previous_actions=[], + previous_reasons=[], + previous_responses=[] + ) + return {'agent': agent, 'objective': objective} + + def predict_action(self, objective, observation, url=None): + observation = observation["text"] if isinstance(observation, dict) else observation + if self.stack.is_empty(): + new_element = self.init_root_agent(objective=objective) + self.stack.push(new_element) + + action, reason = None, None + while not self.stack.is_empty(): + element = self.stack.peek() + action, reason = element['agent'].predict_action(objective=element['objective'], observation=observation, url=url) + if (not self.is_done(action)) and self.is_low_level_action(action): + element['agent'].receive_response("") + return action, reason + if (not self.is_done(action)) and self.is_high_level_action(action): + new_element = self.init_agent(action) + self.stack.push(new_element) + if self.logging: + self.log_step(objective=element['objective'], url=url, observation=observation, action=action, reason=reason, status={}) + continue + if self.is_done(action): + self.stack.pop() + if not self.stack.is_empty(): + self.stack.peek()['agent'].receive_response(re.search(r"\[(.*?)\]", action).group(1)) + if self.logging: + self.log_step(objective=element['objective'], url=url, observation=observation, action=action, reason=reason, status={}) + continue + return action, reason \ No newline at end of file diff --git a/webagents_step/environment/env.py b/webagents_step/environment/env.py new file mode 100644 index 0000000..949ef07 --- /dev/null +++ b/webagents_step/environment/env.py @@ -0,0 +1,18 @@ +class WebEnvironment(): + def __init__(self): + pass + + def reset(self): + pass + + def observation(self): + pass + + def get_url(self): + pass + + def step(self, action): + pass + + def done(self): + pass diff --git a/webagents_step/environment/liveweb.py b/webagents_step/environment/liveweb.py new file mode 100644 index 0000000..6680424 --- /dev/null +++ b/webagents_step/environment/liveweb.py @@ -0,0 +1,175 @@ +from time import sleep +import pandas as pd +import re + +from webagents_step.parser import ( + heihei_web_parser, + playwright_parser_nat, + playwright_parser_webarena, +) +from webagents_step.environment.env import WebEnvironment + + +class LiveWebEnvironmentWrapper(WebEnvironment): + def __init__( + self, + url=None, + objective=None, + parser_type="heihei", + observation_type="text", + text_observation_type="accesibility_tree", + max_browser_rows=1000, + max_steps=50, + step_delay=2, + headless=False, + ): + self.url = url + self.objective = objective + self.headless = headless + self.parser_type = parser_type + self.observation_type = observation_type + self.text_observation_type = text_observation_type + self.max_browser_rows = max_browser_rows + self.max_steps = max_steps + + self.steps = 0 + self.is_done = False + self.parse_timeout = 5 + self.step_delay = step_delay + self.response = "" + + async def init_parser(self): + if self.parser_type == "heihei": + self.parser = heihei_web_parser.HeiHeiWebParser() + await self.parser.init() + elif self.parser_type == "playwright_webarena": + self.parser = playwright_parser_webarena.PlaywrightParserWebArena( + headless=self.headless, + observation_type=self.observation_type, + text_observation_type=self.text_observation_type, + ) + self.parser.init() + elif self.parser_type == "playwright_nat": + self.parser = playwright_parser_nat.PlaywrightParserNat( + headless=self.headless + ) + await self.parser.init() + else: + raise NotImplementedError(f"{self.parser_type} not implemented.") + + if self.url is not None: + await self.parser.go_to_page(self.url) + self.clear_page_presets() + await self.parser.parse_page() + + def clear_page_presets(self): + pass + + async def reset(self): + await self.close() + await self.init_parser() + + async def close(self): + await self.parser.close() + + async def observation(self, tab_id=None, format=None): + format = self.text_observation_type if format is None else format + if self.parser_type == "heihei": + try: + browser_content = await self.parser.parse_page( + format=format, tab_id=tab_id + ) + except: + sleep(self.parse_timeout) + browser_content = await self.parser.parse_page( + format=format, tab_id=tab_id + ) + else: + browser_content = await self.parser.parse_page() + + if format not in ["htree", "html", "json"]: + browser_content = [str(w) for w in browser_content] + browser_content = browser_content[: self.max_browser_rows] + browser_content = "\n".join(browser_content) + + return browser_content + + def get_log(self): + return self.df_log + + def get_response(self): + return self.response + + def get_url(self): + return self.parser.get_url() + + async def execute_action(self, action): + """ + Execute a given action based on the action type, + - click [id]: Clicks an element based on the provided id. + - type [id] [content]: Types the provided content into the element with the specified id. + - goto [url]: Navigates to an existing tab at that URL + - open [url]: Opens a new tab with provided URL + - copy [content]: Copies content, but no-op action + - stop [response]: Stops execution and optionally provides a response. + """ + click_match = re.match(r"click \[(\S+)\]", action, re.IGNORECASE) + type_match = re.match(r"type \[(\S+)\] \[(.+)\]", action, re.IGNORECASE) + goto_match = re.match(r"goto \[(\S+)\]", action, re.IGNORECASE) + open_match = re.match(r"open \[(\S+)\]", action, re.IGNORECASE) + copy_match = re.match(r"copy \[(\S+)\]", action, re.IGNORECASE) + stop_match = re.match(r"stop \[([^\]]*)\]", action, re.IGNORECASE) + + if click_match: + id = click_match.group(1) + if not id.isdigit(): + raise Exception("Id not a valid integer") + await self.parser.click(int(id)) + + elif type_match: + id = type_match.group(1) + content = type_match.group(2) + if not id.isdigit(): + raise Exception("Id not a valid integer") + await self.parser.type(int(id), content) + + elif goto_match: + url = goto_match.group(1) + tab_id, tab_url = await self.parser.get_tab_from_url(url) + await self.parser.go_to_page(url) + + elif open_match: + url = open_match.group(1) + await self.parser.go_to_page(url) + + elif copy_match: + pass + + elif stop_match: + self.response = stop_match.group(1) + self.is_done = True + + else: + print(f"[execute_action] Error {action} not defined") + + async def step(self, action, delay=None): + delay = self.step_delay if delay is None else delay + + if self.steps > self.max_steps: + print(f"Steps {self.steps} exceeded maximum {self.max_steps}") + self.is_done = True + return + + print(f"[Step {self.steps+1}] {action}") + try: + await self.execute_action(action) + except Exception as e: + print(f"Error while executing action '{action}'. Details: {e}") + + sleep(delay) + self.steps = self.steps + 1 + + return {"done": self.is_done, "response": self.response} + + def done(self): + return self.is_done diff --git a/webagents_step/parser/playwright_parser_webarena.py b/webagents_step/parser/playwright_parser_webarena.py new file mode 100644 index 0000000..c5bb5c6 --- /dev/null +++ b/webagents_step/parser/playwright_parser_webarena.py @@ -0,0 +1,99 @@ +from sys import platform +from playwright.sync_api import sync_playwright +from browser_env.processors import TextObervationProcessor, ImageObservationProcessor + + +class PlaywrightParserWebArena: + def __init__( + self, + headless=True, + observation_type="text", + text_observation_type="accessibility_tree", + viewport_size={"width": 1280, "height": 1080}, + current_viewport_only=True, + ): + self.headless = headless + self.viewport_size = viewport_size + self.current_viewport_only = current_viewport_only + self.observation_type = observation_type + self.text_observation_type = text_observation_type + + self.playwright = sync_playwright().start() + self.browser = self.playwright.chromium.launch(headless=self.headless) + self.context = self.browser.new_context( + viewport=self.viewport_size, + device_scale_factor=1, + ) + + self.page = self.context.new_page() + client = self.page.context.new_cdp_session(self.page) + if (self.observation_type == "text") and ( + self.text_observation_type == "accessibility_tree" + ): + client.send("Accessibility.enable") + self.page.client = client + + ## scratch ## + # initialize with html string + # self.page.goto(url if "://" in url else "http://" + url) + # potentially later + # self.page.goto("https://www.google.com", wait_until='networkidle') + # print(self.page.accessibility.snapshot()) + # self.page = self.page.accessibility.snapshot() + + self.text_processor = TextObervationProcessor( + observation_type=self.text_observation_type, + current_viewport_only=self.current_viewport_only, + viewport_size=self.viewport_size, + ) + self.image_processor = ImageObservationProcessor(observation_type="image") + + def clear_page_presets(): + pass + + def observation_processor(self): + if self.observation_type == "text": + return self.text_processor + elif self.observation_type == "image": + return self.image_processor + else: + raise ValueError("Invalid observation type") + + def get_url(self): + return self.page.url + + def go_to_page(self, url: str): + self.page.goto(url if "://" in url else "http://" + url) + + def close(self): + self.browser.close() + self.playwright_context.stop() + + def click_xy(self, x: float, y: float) -> None: + viewport_size = self.page.viewport_size + self.page.mouse.click(x * viewport_size["width"], y * viewport_size["height"]) + + def click(self, id: int) -> None: + element_center = self.observation_processor().get_element_center(id) + self.click_xy(element_center[0], element_center[1]) + + def type(self, id: int, text: str, clear: bool = True): + if clear: + self.clear(id) + self.click(id) + self.page.keyboard.type(text) + + def clear(self, id: int) -> None: + self.click(id) + select_key = "Meta" if platform.startswith("darwin") else "Control" + self.page.keyboard.down(select_key) + self.page.keyboard.press("a") + self.page.keyboard.up(select_key) + self.page.keyboard.press("Backspace") + + def parse_page(self): + observation = self.observation_processor().process( + page=self.page, client=self.page.client + ) + + return observation diff --git a/webagents_step/prompts/webarena/step_fewshot_template.py b/webagents_step/prompts/webarena/step_fewshot_template.py new file mode 100644 index 0000000..a309613 --- /dev/null +++ b/webagents_step/prompts/webarena/step_fewshot_template.py @@ -0,0 +1,1457 @@ +github_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_commits [query]`: Given you are in a project page, this subroutine searches Gitlab for commits made to the project and retrieves information about a commit. This function returns the answer to the query. +`search_issues [query]`: Use this subroutine to find an issue on Gitlab. Any objective that requires finding an issue as an intermediate step, e.g. open latest issue, open issue with and check for X, should call this subroutine +`create_project [query]`: Given you are in the create new project page, this subroutine completes the act of creating a project, adding members etc. +`create_group [query]`: Given you are in the create new group page, this subroutine completes the act of creating a group, adding members etc. + + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?] +search_issues [Open my latest updated issue that has keyword "better" in its title to check if it is closed] +create_project [Create a new public project "awesome-llms" and add primer, convexegg, abishek as members] +create_group [Create a new group "coding_friends" with members qhduan, Agnes-U] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response, e.g. 1 = find_commits [query] + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these GENERAL INSTRUCTIONS: +* PREVIOUS ACTIONS contains previous actions and subroutine calls with corresponding responses, e.g. 1 = find_commits [query] implies that find_commits subroutine returned a response of 1 commit +* USE the responses from your subroutine. Do NOT try to solve the subroutine objective again by yourself +* DO NOT count commits yourself. Return the response from find_commits in PREVIOUS ACTIONS, e.g. 1 = find_commits [query] implies you should return stop [1] +* If the subroutine returns a response, e.g. Open = search_issues [query], and you have to issue a stop, then issue the same format as that of the response, e.g. stop [Open] +* If the objective is to check if an issue, pull request, etc is open or closed, respond as though you are answering the question, e.g. "No, it is open", "Yes, it is closed" +* To access all public projects, you need to navigate to Explore +* In a repository page, every repository has 4 metrics listed in order Stars, Forks, Merge Requests, and Issues. +* If a project does not exist, then you cannot do any operations on it like cloning it or creating issues etc. +* The command to clone a project is git clone [project URL] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the subroutine actions or GENERAL INSTRUCTIONS apply and how that affects the action you choose. +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +How many commits did Mike Perotti make to diffusionProject on 03/23/2023? +OBSERVATION: +[4] RootWebArea 'Projects · Dashboard · GitLab' focused: True + [1664] heading 'The diffusion / diffusionProject.com' + [1522] link 'The diffusion / diffusionProject.com +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. We are in the dashboard page. The task is to find how many commits Mike Perotti made to the diffusionProject. We have to first click on the project page. Once we are in the project page, we can use the find_commits subroutine. The id corresponding to the project page is 1664. In summary, the next action I will perform is ```click [1664]``` +ACTION: +click [1664] +"""}, +{ +"input": """ +OBJECTIVE: +How many commits did Mike Perotti make to diffusionProject on 03/23/2023? +OBSERVATION: +[2234] RootWebArea 'The diffusionProject · GitLab' focused: True + [3014] link '0' + [3373] link '2,320 Commits' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. We are in the diffusionProject page. The task is to find how many commits Mike Perotti made to the diffusionProject. Since we are in the project page, we can use the find_commits subroutine. In summary, the next action I will perform is ```find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?]``` +ACTION: +find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?] +""" +}, +{ + "input": """ +OBJECTIVE: +How many stars does a11y-webring.club have? +OBSERVATION: + [1258] link 'A' + [1248] heading 'Byte Blaze / a11y-webring.club' + [1831] link 'Byte Blaze / a11y-webring.club' + [1683] generic 'Public - The project can be accessed without any authentication.' + [1673] StaticText 'Owner' + [1241] generic 'globe with meridians' + [1684] StaticText '🌐' + [1771] StaticText ' A webring for digital accessibility practitioners.' + [1726] link '2' + [1463] link '0' + [1325] link '1' + [1784] link '4' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Every repository has 4 metrics listed in order Stars, Forks, Merge Requests, and Issues. Hence, [1726] link '2' suggests 2 stars. +ACTION: +stop [2] +""" +} +] +} + +find_commits = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`scroll [direction=down|up]`: Scroll the page up or down. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +scroll [down] +stop [Mark made 2 commits on 07/08/2023] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +* To find a list of all commits, you must navigate to the commits section of the repository +* Look at the first and last date in your observation to know if the desired date is in the range +* If it's in the range but not visible, that means no commits were made on that date +* If the date is outside of the range, you need to scroll up/down to get to the desired date range. Scrolling down takes you to a date earlier in time (e.g. Feb 2023 is earlier in time than Mar 2023) +* To count commits from a specific author, count the number of times their avatar (e.g. img " avatar") appears in the observation. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the general instructions or examples apply and how that affects the action you choose. +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +find_commits [How many commits did Mike Perotti make to diffusionProject on 02/02/2023?] +OBSERVATION: +[8420] StaticText '02 Feb, 2023' + [8423] StaticText '3 commits' + [8426] img "Mike Perrotti's avatar" + [8428] link 'Coverage improvements (#449)' + [8433] link 'Mike Perrotti' + [8434] StaticText ' authored ' + [8435] time 'Feb 1, 2023 10:43pm EST' + [8437] StaticText '1 year ago' + [10354] button 'Unverified' + [8444] StaticText 'a323cbb6' + [8442] button 'Copy commit SHA' live: polite atomic: False relevant: additions text + [8443] link 'Browse Files' + [8455] img "Mike Perrotti's avatar" + [8457] link 'updates guidance about numeric table values to be more specific (#451) + [8462] link 'Mike Perrotti' + [8463] StaticText ' authored ' + [8464] time 'Feb 1, 2023 10:26pm EST' + [8466] StaticText '1 year ago' + [10356] button 'Unverified' + [8473] StaticText '9bf4ae35' + [8471] button 'Copy commit SHA' live: polite atomic: False relevant: additions text + [8472] link 'Browse Files' + [8484] img "Emily Brick's avatar" + [8486] link 'Correct typos on Contributing Guidelines and Follow (#1518)' + [8491] link 'Emily Brick' + [8492] StaticText ' authored ' + [8493] time 'Feb 1, 2023 7:40pm EST' + [8495] StaticText '1 year ago' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [3373] +scroll [down] +scroll [down] +""", +"response": """ +REASON: +The objective is to find how many commits Mike Perotti made on Feb 2, 2023. I see that there has been 3 commits on 02 Feb, 2023. +However, I must count number of times img "Mike Perrotti's avatar" appears. +I see [8426] img "Mike Perrotti's avatar", [8455] img "Mike Perrotti's avatar". +Counting this leads to 2 commits made by Mike Perotti. In summary, the next action I will perform is ```stop [2]``` +ACTION: +stop [2] +""" +}, +] +} + +search_issues = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [Closed] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these general instructions: +* First navigate the Issues page +* Once you are in the Issues page, you MUST first navigate to all issues so that you see both open and closed issues for solving the objective +* You may not see all issues listed at once, use the search bar to search for appropriate keywords and filter down to relevant set of issues +* If the objective says to "Open ... issue, check if it is X", you must first open the specific issue page by clicking it. Do not stop [] until you have navigated to the specific issue page. +* Once you are on the issue page, return the appropriate status +* In your status, if the objective is to check if an issue is open or clossed, respond as though you are answering a question, e.g. "No, it is open", "Yes, it is closed" +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the general instructions or examples apply and how that affects the action you choose. +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +Tab 0 (current): Issues \u00b7 Dashboard \u00b7 GitLab\n\n[2234] RootWebArea 'Issues \u00b7 Dashboard \u00b7 GitLab' focused: True\n\t[2241] link 'Skip to content'\n\t[2295] link 'Dashboard'\n\t[4183] button '' hasPopup: menu expanded: False\n\t[3082] textbox 'Search GitLab' required: False\n\t[3025] generic 'Use the shortcut key / to start a search'\n\t[2367] link 'Create new...'\n\t[2369] link 'Issues'\n\t\t[2638] generic '13 assigned issues'\n\t[2370] link 'Merge requests'\n\t\t[2640] generic '8 merge requests'\n\t[2372] link 'To-Do List'\n\t\t[2656] generic 'Todos count'\n\t[2373] link 'Help'\n\t[2375] link 'Byte Blaze'\n\t\t[2690] img 'Byte Blaze'\n\t[2247] main ''\n\t\t[2259] heading 'Issues'\n\t\t[2332] link 'Select project to create issue'\n\t\t[2334] button 'Toggle project select'\n\t\t[2335] link 'Open 13'\n\t\t[2336] link 'Closed 53'\n\t\t[2337] link 'All 66'\n\t\t[2268] link 'Subscribe to RSS feed'\n\t\t[2269] link 'Subscribe to calendar'\n\t\t[2390] button 'Recent searches'\n\t\t[3466] button 'Assignee = Byte Blaze'\n\t\t\t[4251] button ''\n\t\t[3084] textbox '' required: False\n\t\t[3462] button ''\n\t\t[2282] group ''\n\t\t\t[3115] button 'Updated date' hasPopup: listbox\n\t\t\t[2349] link 'Sort direction'\n\t\t[4035] link 'Tm Theme Editor' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. Since the objective is to search over all issues, first I need to navigate to the page containing All issues. Looking at the observation, I am not certain if I am seeing all issues. Hence, I must click the link with text link 'All 66' that suggests that it leads to the page with all issues. In summary, the next action I will perform is ```click [2337]``` +ACTION: +click [2337] +"""}, +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +Tab 0 (current): Issues \u00b7 Dashboard \u00b7 GitLab\n\n[4371] RootWebArea 'Issues \u00b7 Dashboard \u00b7 GitLab' focused: True\n\t[4622] link 'Skip to content'\n\t[4631] link 'Dashboard'\n\t[6161] button '' hasPopup: menu expanded: False\n\t[4383] textbox 'Search GitLab' required: False\n\t[4660] generic 'Use the shortcut key / to start a search'\n\t[4680] link 'Create new...'\n\t[4700] link 'Issues'\n\t\t[4702] generic '13 assigned issues'\n\t[4707] link 'Merge requests'\n\t\t[4710] generic '8 merge requests'\n\t[4732] link 'To-Do List'\n\t\t[4734] generic 'Todos count'\n\t\t\t[4738] StaticText '5'\n\t[4739] link 'Help'\n\t[4780] link 'Byte Blaze'\n\t\t[4782] img 'Byte Blaze'\n\t[4387] main ''\n\t\t[4841] heading 'Issues'\n\t\t[4843] link 'Select project to create issue'\n\t\t[4844] button 'Toggle project select'\n\t\t[4862] link 'Open 13'\n\t\t[4867] link 'Closed 53'\n\t\t[4872] link 'All 66'\n\t\t[4877] link 'Subscribe to RSS feed'\n\t\t[4878] link 'Subscribe to calendar'\n\t\t[4894] button 'Recent searches'\n\t\t[4400] button 'Assignee = Byte Blaze'\n\t\t\t[4946] button ''\n\t\t[4398] textbox '' required: False\n\t\t[4893] button ''\n\t\t[5199] group ''\n\t\t\t[5202] button 'Updated date' hasPopup: listbox\n\t\t\t[5201] link 'Sort direction'\n\t\t[5299] link 'Tm Theme Editor'\n\t\t[5302] StaticText 'byteblaze/a11y-syntax-highlighting#1 '\n\t\t[5303] StaticText '\u00b7 created '\n\t\t[4423] time 'Apr 2, 2020 12:13am EDT'\n\t\t\t[5306] StaticText '3 years ago'\n\t\t[5304] StaticText ' by '\n\t\t[5305] link 'earle'\n\t\t[5312] link 'Assigned to Byte Blaze'\n\t\t[5314] link ' 14'\n\t\t[5320] StaticText 'updated '\n\t\t[4427] time 'Mar 27, 2023 7:15pm EDT'\n\t\t\t[5321] +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2337] +""", +"response": """ +REASON: +Let's think step-by-step. I see all issues on the current page. Given the objective, I must search for issues that contain the keyword "homepage content". To do this, I will type the keyword into the search input textbox that appears just before the list of issues. In summary, the next action I will perform is ```type [4398] [homepage content] [1]``` +ACTION: +type [4398] [homepage content] [1] +""" +}, +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +'\n\t\t[7142] StaticText '\u00b7 created '\n\t\t[6357] time 'Jul 15, 2020 2:48pm EDT'\n\t\t\t[7154] StaticText '3 years ago'\n\t\t[7143] StaticText ' by '\n\t\t[7144] link 'Byte Blaze'\n\t\t[7145] StaticText ' \\xa0 '\n\t\t[7147] link 'bug'\n\t\t[7149] link 'claimed'\n\t\t[7151] link 'redesign'\n\t\t[7153] link 'styling'\n\t\t[7169] StaticText 'CLOSED'\n\t\t[7170] link 'Assigned to Byte Blaze'\n\t\t[7172] link ' 4'\n\t\t[7178] StaticText 'updated '\n\t\t[6361] time 'Mar 23, 2023 4:40am EDT'\n\t\t\t[7179] StaticText '10 months ago'\n\t\t[7182] link \"Rethink the homepage's content\"\n\t\t[7185] StaticText 'a11yproject/a11yproject.com#719 '\n\t\t[7186] StaticText '\u00b7 created '\n\t\t[6367] time 'Dec 30, 2018 2:42pm EST'\n\t\t\t[7197] StaticText '5 years ago'\n\t\t[7187] StaticText ' by '\n\t\t[7188] link 'Byte Blaze'\n\t\t[7190] StaticText '\\xa0 '\n\t\t[7191] link ' Content Updates for 2019'\n\t\t[7192] StaticText ' \\xa0 '\n\t\t[7194] link 'enhancement'\n\t\t[7196] link 'redesign'\n\t\t[7213] StaticText 'CLOSED'\n\t\t[7214] link 'Assigned to Byte Blaze'\n\t\t[7216] link ' 5'\n\t\t[7222] StaticText 'updated '\n\t\t[6371] time 'Mar 23, 2023 4:39am EDT'\n\t\t\t[7223] StaticText +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2337] +type [4398] [homepage content] [1] +""", +"response": """ +REASON: +Let's think step-by-step. I see one issue called "Rethink the homepage's content" that contains the keywords "homepage content". Since it is only one issue, it must be the latest updated issue. According to the general instructions, since the objective asks me to open the issue, I must click the issue. In summary, the next action I will perform is ```click [7182]``` +ACTION: +click [7182] +""" +}, +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +button 'Collapse sidebar'\n\t[8080] navigation 'Breadcrumbs'\n\t\t[8095] link 'The A11Y Project'\n\t\t[8101] link 'a11yproject.com'\n\t\t[8108] link 'Issues'\n\t\t[8114] link '#719'\n\t[7383] main ''\n\t\t[8138] StaticText 'Closed'\n\t\t[8149] StaticText 'Issue created '\n\t\t[8150] time 'Dec 30, 2018 7:42pm'\n\t\t[8151] StaticText ' by' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2337] +type [4398] [homepage content] [1] +click [7182] +""", +"response": """ +REASON: +The observation indicates that the issue titled \"Rethink the homepage's content (#719)\" is already open in the current tab. There is also a StaticText element with the text 'Closed' (id 8138), which suggests that the status of the issue is visible on the page. Therefore, no further navigation or clicks are required to complete the task. Hence, I must stop and return the desired response. In summary, the next action I will perform is ```stop [Closed]``` +ACTION: +"stop [Closed]" +""" +}, +] +} + +create_project = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these general instructions: +1. To add new members, once you have created the project, click on Project Information in the sidebar to be guided to a link with memmbers. +2. When adding members, first type their name, then click on their name from the down down. Consult PREVIOUS ACTIONS to see if you have typed and selected the names. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +create_project [Create a new public project \"awesome-llms\" and add primer, convexegg, abishek as members] +OBSERVATION: +Tab 0 (current): Byte Blaze / awesome-llms \u00b7 GitLab\n\n[34973] RootWebArea 'Byte Blaze / awesome-llms \u00b7 GitLab' focused: True\n\t[35051] link 'Skip to content'\n\t[35060] link 'Dashboard'\n\t[36630] button '' hasPopup: menu expanded: False\n\t[34985] textbox 'Search GitLab' required: False\n\t[35092] generic 'Use the shortcut key / to start a search'\n\t[35112] link 'Create new...'\n\t[35151] link 'Issues'\n\t\t[35153] generic '13 assigned issues'\n\t[35158] link 'Merge requests'\n\t\t[35161] generic '8 merge requests'\n\t[35183] link 'To-Do List'\n\t\t[35185] generic 'Todos count'\n\t[35190] link 'Help'\n\t[35231] link 'Byte Blaze'\n\t\t[35233] img 'Byte Blaze'\n\t[35287] complementary 'Project navigation'\n\t\t[35292] listitem 'awesome-llms'\n\t\t\t[35313] link 'awesome-llms'\n\t\t\t\t[35317] StaticText 'A'\n\t\t[35319] link 'Project information'\n\t\t[35345] link 'Repository'\n\t\t[35387] link 'Issues'\n\t\t\t[35397] StaticText '0'\n\t\t[35421] link 'Merge requests'\n\t\t[35438] link 'CI/CD'\n\t\t[35468] link 'Security & Compliance'\n\t\t[35486] link 'Deployments'\n\t\t[35512] link 'Packages and registries'\n\t\t[35534] link 'Infrastructure'\n\t\t[35560] link 'Monitor'\n\t\t[35590] link 'Analytics'\n\t\t[35616] link 'Wiki'\n\t\t[35629] link 'Snippets'\n\t\t[35642] link 'Settings'\n\t\t[35290] button 'Collapse sidebar'\n\t[4817] generic 'Public - The project can be accessed without any authentication.'\n\t\t[4823] StaticText 'Project ID: 195 '\n\t\t[4824] button 'Copy project ID' live: polite atomic: False relevant: additions text\n\t\t[5115] button '' hasPopup: menu expanded: False\n\t\t[4833] button 'Star'\n\t\t[4834] link '0'\n\t\t[4844] link 'Fork'\n\t\t[4843] link '0'\n\t\t[4857] link '1 Commit'\n\t\t[4865] link '1 Branch'\n\t\t[4873] link '0 Tags'\n\t\t[4881] link '72 KB Project Storage'\n\t\t[6112] link ''\n\t\t[6119] link 'Initial commit'\n\t\t[6122] +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2782] +type [3910] [awesome-llms] [0] +click [3903] +""", +"response": """ +REASON: +Let's think step-by-step. The task is to create a new public project named "awesome-llms" and add members to it. However, based on the observation, it appears that the project "awesome-llms" has already been created, as indicated by the presence of elements such as 'Project ID: 195' and 'Initial commit'. The next step is to add members to the project. To do this, I need to navigate to the project information which contains a link to add members. The link to 'Project information' is present in the observation with id 35319. In summary, the next action I will perform is ```click [35319]``` +ACTION: +click [35319] +"""}, +] +} + +create_group = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these general instructions: +1. To add new members, click on the Members tab in the side pane. If you don't see it, click on Group Information in the sidebar to be guided to a link with memmbers. +2. When adding members, first type their name, then click on their name from the down down. Consult PREVIOUS ACTIONS to see if you have typed and selected the names. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +reddit_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_subreddit [query]`: Find a subreddit corresponding to the query. The query can either be the name of the subreddit or a informative description of what the subreddit may contain. The subroutine hands back control once it navigates to the subreddit by returning "N/A" to denote success. +`find_user [user_name]`: Navigate to the page of a user with user_name. The page contains all the posts made by the user. + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +find_subreddit [books] +find_subreddit [something related to driving in Pittsburgh] +find_subreddit [most appropriate subreddit for X] +find_user [AdamCannon] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. If you have to do a task related to a particular user, first find the user using find_user subroutine +2. Otherwise, if you have to post or edit a post in a subreddit, first find the subreddit using the find_subreddit subroutine. Pass in as much information in the argument. While find_subreddit will return the most relevant subreddit to your query, it is okay if it does not exactly match your query. +3. When making a post or a comment to a reply, look at your OBSERVATION or PREVIOUS ACTIONS to make sure you are not repeating the same action. +4. When typing the "Title" of a submission, make sure to match the phrasing in objective exactly. If the objective said Post "what could X", type that in exactly as the title. In your REASON, you MUST specify the formatting guidelines you are following. +5. When creating a Forum, be sure to fill in the title, description and sidebar as specified in the objective exactly. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_subreddit = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +* The objective find_subreddit [query] asks you to navigate to the subreddit that best matches the query. The query can be specific or vague. +* The first step is to navigate to Forums to see the list of subreddits. However, if you have done this already (indicated as non empty PREVIOUS ACTIONS), do not repeat this step. +* Under forums, you will see only a subset of subreddits. To get the full list of subreddits, you need to navigate to the Alphabetical option. +* To know you can see the full list of subreddits, you will see 'All Forums' in the observation +* Often you will not find a focused subreddit that exactly matches your query. In that case, go ahead with the closest relevant subreddit. +* To know that you have reached a subreddit successfully, you will see '/f/subreddit_name' in the observation. +* Once you have navigated to any specific subreddit, return stop [N/A]. Even if the subreddit is generally related and not specific to your quwey, stop here and do not try to search again for another subreddit. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_user = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] +goto [https://localhost:9999/user/] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective find_user [user_name] asks you to navigate the page of a user with user_name +2. To do so, look at the current base URL (e.g. https://localhost:9999) and add a suffix /user/user_name, i.e. +goto [https://localhost:9999/user/user_name] +3. Once you have navigated to the user page (as seen in your past actions), return stop [N/A] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +shopping_admin_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`scroll [direction=down|up]`: Scroll the page up or down. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_customer_review [query]`: Find customer reviews for a particular product using the query to specify the kind of review. +`find_order [query]`: Find an order corresponding to a particular customer or order number. +`search_customer [query]`: Find a customer given some details about them such as their phone number. + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +scroll [down] +find_customer_review [Show me customer reviews for Zoe products] +find_order [Most recent pending order by Sarah Miller] +find_order [Order 305] +search_customer [Search customer with phone number 8015551212] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. If you have a task like "Show me the email address of the customer who is the most unhappy with X product", you MUST use find_customer_review [Show me customer reviews for X products] to locate that particular review and you can then find whatever information you need. Do not try to solve the task without using the subroutine as it contains specific instructions on how to solve it. +2. If you have a task like "Show me the customers who have expressed dissatisfaction with X product", you MUST use find_customer_review [Show me customer reviews for X product]. +3. If you have a task about a particular order, e.g. "Notify X in their most recent pending order with message Y", you MUST use find_order [Most recent pending order for X] to locate the order, and then do operations on that page. Do this even if the order is visible in the current page. +4. To write a comment on the order page, you MUST scroll[down] till you find the Comment section. You MUST NOT click on "Comments History" tab, it does not lead you to the right place. Stay on the current page and scroll down to see the comment section. +5. If you have a task about a particular order, e.g. "Cancel order X", you MUST use find_order [Find order X] to locate the order, and then do operations on that page. +6. If you have a task like "Find the customer name and email with phone number X", you MUST use search_customer [Search customer with phone number X] to locate the customer, and then answer the query. Do NOT click on CUSTOMERS side panel. +7. You MUST use Subroutine Actions whenever possible. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the general instructions above apply that would affect the action you choose. +""", + +"response": "", + +"examples": [ +] +} + +find_customer_review = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective find_customer_review [query] asks you to navigate to the product page containing customer reviews. +2. To navigate to a review, first click on REPORTS in the side panel +3. Once you have clicked on REPORTS, and you see the Reports panel with Marketing, Sales, Reviews, Customers etc, click on By Products under Customers. +4. Once you are in the Product Reviews Report, you need to locate the product by searching for it. Use the gridcell below Product to search for a product. Do not use other search boxes. Look at the example below where I show you how to search for Zoe in the correct gridcell. +5. When searching for a product, search the first word only like Zoe, or Antonia or Chloe. +6. Once the product shows up, click on 'Show Reviews'. +7. Once all the reviews show up, return stop [N/A] to hand back control to the agent that queried you. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ + { +"input": """ +OBJECTIVE: +find_product_review [Show me the review of the customer who is the most unhappy with the style of Zoe products] +OBSERVATION: +Tab 0 (current): Product Reviews Report / Reviews / Reports / Magento Admin\n\t\t[1992] table ''\n\t\t\t[2723] row ''\n\t\t\t\t[2724] columnheader 'ID' required: False\n\t\t\t\t[2725] columnheader 'Product' required: False\n\t\t\t\t[2726] columnheader '\u2191 Reviews' required: False\n\t\t\t\t[2727] columnheader 'Average' required: False\n\t\t\t\t[2728] columnheader 'Average (Approved)' required: False\n\t\t\t\t[2729] columnheader 'Last Review' required: False\n\t\t\t\t[2730] columnheader 'Action' required: False\n\t\t\t[1994] row ''\n\t\t\t\t[1995] gridcell '' required: False\n\t\t\t\t\t[1996] textbox '' required: False\n\t\t\t\t[1997] gridcell '' required: False\n\t\t\t\t\t[1998] textbox '' required: False\n\t\t\t\t[1999] gridcell '' required: False\n\t\t\t\t\t[2000] textbox '' required: False\n\t\t\t\t[2001] gridcell '' required: False\n\t\t\t\t\t[2002] textbox '' required: False\n\t\t\t\t[2003] gridcell '' required: False\n\t\t\t\t\t[2004] textbox '' required: False\n\t\t\t\t[2005] gridcell 'undefined \\ue627 undefined \\ue627' required: False\n\t\t\t\t\t[2008] textbox 'From' required: False\n\t\t\t\t\t[3196] button 'undefined \\ue627'\n\t\t\t\t\t[2010] textbox 'To' required: False\n\t\t\t\t\t[3201] button 'undefined \\ue627'\n\t\t\t\t[2747] gridcell '\\xa0' required: False\n\t\t\t[2759] row 'https://localhost:7780/admin/review/product/index/productId/1620/'\n\t\t\t\t[2779] gridcell '1620' required: False\n\t\t\t\t[2780] gridcell 'Erica Evercool Sports Bra' required: False\n\t\t\t\t[2781] gridcell '4' required: False\n\t\t\t\t[2782] gridcell '60.0000' required: False\n\t\t\t\t[2783] gridcell '60.0000' required: False\n\t\t\t\t[2784] gridcell 'Apr 19, 2023, 12:15:19 PM' required: False\n\t\t\t\t[2785] gridcell 'Show Reviews' required: False\n\t\t\t\t\t[2792] link 'Show Reviews'\n\t\t\t[2760] row 'https://localhost:7780/admin/review/product/index/productId/39/'\n\t\t\t\t[2794] gridcell '39' required: False\n\t\t\t\t[2795] gridcell +URL: +https://localhost:7780/admin/reports/report_review/product/ +PREVIOUS ACTIONS: +click [1195] +click [1531] +""", +"response": """ +REASON: +Let's think step-by-step. We are in the Product Review Report page. We have to search for a Zoe product. To do so, I have to type in Zoe in a gridcell corresponding to the Product column. The Product column is the second column after ID. Therefore I have to find the second gridcell just below it. The first one is 1995, and the second one is 1997. In summary, the next action I will perform is type [1997] [Zoe] [1] +ACTION: +type [1997] [Zoe] [1] +"""}, +] +} + +find_order = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`scroll [direction=down|up]`: Scroll the page up or down. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] +scroll [down] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +* The objective find_order [query] asks you to navigate to the order page corresponding to the query +* To navigate to orders, first go to SALES in the side panel +* Once you have clicked on SALES, go to Orders +* Once you are in the orders page, you have to use the 'Filter' button to filter down to desired criteria +* Desired criterias include filtering down to a specific order ID field or Name field. ONLY use fields that are in the objective +* You MUST use Filter to find orders instead of using the search bar +* If there are any active filters, be sure to clear them before entering your filter criteria +* In your filtered list of orders, if you don't find the desired order, make sure to scroll down till you find the order or reach end of page (typically indicated by 'Copyright © ...' in the observation) +* Once you have found the order, go to View to open the order +* Once you are in the desired order page (as noted by "Order & Account Information") you MUST return stop [N/A] to hand back control to the agent that queried you. Do not go back to another page. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_customer = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective search_customer [query] asks you to search for customer details corresponding to the query +2. To navigate to customers, first click on CUSTOMERS in the side panel +3. Once you have clicked on CUSTOMERS, click on All Customers. +4. Once you are in the customers page, you have to use the 'Search by keyword' text box to search for your customer. Always be sure to search first. For example, for find_order [Search customer with phone number 8015551212], search 8015551212. +5. If the page shows a number has already been searched, click on Clear All first. Then proceed with the search. +6. Once you are done with the search, and the customer with matching query shows up, you MUST return stop [N/A] to hand back control to the agent that queried you. Do not go back to another page. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +shopping_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`scroll [direction=down|up]`: Scroll the page up or down. +`hover [id]`: Hover over an element with id. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`search_order [question]`: Search orders to answer a question about my orders +`find_products [query]`: Find products that match a query +`search_reviews [query]`: Search reviews to answer a question about reviews + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +scroll [down] +hover [11] +search_order [How much I spend on 4/19/2023 on shopping at One Stop Market?] +list_products [List products from PS4 accessories category by ascending price] +search_reviews [List out reviewers, if exist, who mention about ear cups being small] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these GENERAL INSTRUCTIONS: +* If the OBJECTIVE is a question about my orders, you MUST use search_order [question] to answer the question e.g. How much did I spend on X, or What is the size of X that I bought, or Change the delivery address for X. +Do not try to solve the task without using search_order as it contains specific instructions on how to solve it. Do not click on MyAccount directly. +* The response from subroutines is stored in PREVIOUS ACTIONS. For example, $0 = search_order [How much I spend on X?] means that the response was $0. In that case, return the answer directly, e.g. stop [$0]. If the response was N/A, reply stop [N/A]. Trust the answer returned by search_order. +* If the OBJECTIVE is a question about listing / showing products, you MUST use list_products. For example, +list_products [List products from X] +list_products [Show me the most expensive product from X] +* If the OBJECTIVE requires you to retrieve details about a particular order you placed liked SKU, you MUST first use search_order [] to retrieve the SKU. +For example, if the OBJECTIVE is "Fill the form for a refund on X .... Also, ensure to include the order number #161 and the product SKU.", you must first issue search_order [Give me the SKU of X from order number #161]. +* If the OBJECTIVE requires order id and amount, you must first issue search_order [Give me the order id and the amount for X] +* If the OBJECTIVE is about reviews for the product, you MUST use search_reviews. For example, search_reviews [List out reviewers ..] or search_reviews [What are the main criticisms of X] +* Return the response from search_reviews VERBATIM. Trust that it has solved the OBJECTIVE correctly. +* When filling out a form for refund, you must mention the word refund. Also, you MUST NOT use the word "just" or "which". This is against formatting guidelines. E.g. say "It broke after three days" rather than "which broke after just three days" or "The product broke after three days". +* The Contact Us link is usually at the bottom of a page, scroll down to find it. +* If the OBJECTIVE asks you to "Draft" something, perform all necessary actions except submitting at the end. Do NOT submit as this is a draft. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the subroutine actions or GENERAL INSTRUCTIONS apply and how that affects the action you choose. +""", + +"response": "", + +"examples": [ +] +} + +search_order = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`note [content]`: Use this to make a personal note of some content you would like to remember. This shows up in your history of previous actions so you can refer to it. +`go_back`: Navigate to the previously viewed page. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +note [Spent $10 on 4/1/2024] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these GENERAL INSTRUCTIONS: +* Navigate to My Account, then My Orders to access all orders. +* The orders are sorted by descending date. Click on Page Next to go to a earlier date. Click on Page Previous to go to a earlier date. +If you don't see an order for a date, and the first order on the page is after the date, the last order on the page is before the date, then it means there is no order for the date. +* In your REASON, state what is the current range, what range you are looking for, and whether you should search for an earlier or a later date. +* If you have to find the total amount you spent on orders that span multiple pages, use note [Spent $10 on 4/1/2024] to make a personal note before moving on to the next page. When you are done, you can look at PREVIOUS ACTIONS to find all notes. +* When you are adding numbers, work out each addition step by step in REASON. +* Use go_back to go back to a previous page from an order. But before you do, use note [] to make a note that you checked the page, e.g. note [Checked order on 11/29/2023, no picture frame.] +* If you are in an order page and need to go back, issue go_back. Don't click on My Orders else you have to start from all over again. +* Do not keep visiting the same order page over and over again! +To prevent this, whenever you visit a page, always make a note. For example note [Nothing relevant purchased on September 29, 2022] +See note [] to see what dates you have visit, and be sure to not visit that page again. +* Once you are done visiting all the pages, return stop [answer] with the answer to the query. +* If the question is how much did I spend on a date, and I didn't spend anything, return stop [$0] +* If the status of an order shows cancelled, that means I did not spend that money +* If you are asked to change the delivery address on an order, you can't. Reply stop [N/A] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the GENERAL INSTRUCTIONS apply and how that affects the action you choose. +""", + +"response": "", + +"examples": [ +] +} + +list_products = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. Use this whenever any element has the field hasPopup: menu +`goto [url]`: Navigate to a specific URL. Use this when needing to sort by price. Refer to instructions below. +`note [content]`: Use this to make a personal note of some content you would like to remember. This shows up in your history of previous actions so you can refer to it. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] +hover [77] +goto [https://localhost:7770/video-games/playstation-4/accessories.html?product_list_order=price] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. To find a product category, you MUST use hover [id] to expand the popup Menu till you find the leaf element that has no popup. Then click [id] on the leaf element. +For exmaple, to find PS 4 accessories you must hover over Video Games, then hover over Playstation 4, then click on Accessories. +Use note [] eveytime you hover on an item, and don't find the category. This is to ensure you don't keep trying the same category repeatedly. +2. To sort current list of products by price and in ascending order, you MUST use the goto [url] action by appending ?product_list_order=price to the current URL. For example: +If URL is https://localhost:7770/video-games/playstation-4/accessories.html +then issue goto [https://localhost:7770/video-games/playstation-4/accessories.html?product_list_order=price] +3. To sort in descending order, you MUST use the goto [url] action by appending ?product_list_order=price&product_list_dir=desc, e.g. +If URL is https://localhost:7770/video-games/playstation-4/accessories.html +goto [https://localhost:7770/video-games/playstation-4/accessories.html?product_list_order=price&product_list_dir=desc] +4. To list all items less than a particular price, e.g. $25, you MUST use the goto [url] action by appending ?price=0-25 +If URL is https://localhost:7770/video-games/playstation-4/accessories.html +goto [https://localhost:7770/video-games/playstation-4/accessories.html?price=0-25] +5. Once you are done in stop [N/A] +6. If the OBJECTIVE asks you to show the most expensive product, you must click on the product. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_reviews = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`scroll [direction=down|up]`: Scroll the page up or down. +`note [content]`: Use this to make a personal note of some content you would like to remember. This shows up in your history of previous actions so you can refer to it. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +scroll [down] +note [Reviewer X made comment Y] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +* If you are not in the product page, you can search for the product using the search bar. +* To find the list of reviews, search for a link with Reviewers. If you can't find it, scroll down to search for it. +* Iterate over all reviews. For every relevant review, make a note [reviewer_name: review_info]. Record the relevant reviewer_name and review VERBATIM. Once you are done with all the reviews in a page, scroll down to access more reviews. +* Refer to PREVIOUS ACTIONS to know which reviews you have noted already. If you have noted a review already, look for the next review in your current OBSERVATION or scroll down. +* Do NOT repeat the note [] action for the same review. +* Not all reviews will be visible on the reviews page. You MUST scroll down till you reach the end of the page. You will know that you have reached the end of the page if you see “Contact Us” in the OBSERVATION. +* Once you have scrolled through all reviews, combine all your noted reviews that you can find under PREVIOUS ACTIONS. To combine, create a list of dicts where every dict has a name and review key. Be sure to capture ALL the reviews in your note. Return that as stop [{name: reviewer_name_1, review: review_1}, {name: reviewer_name_2, review: review_2}, ..] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +In your REASON, you MUST specify if any of the general instructions apply and how that affects the action you choose. +""", + +"response": "", + +"examples": [ +] +} + +maps_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`scroll [direction=down|up]`: Scroll the page up or down. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_directions [query]`: Find directions between two locations to answer the query +`search_nearest_place [query]`: Find places near a given location + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +scroll [down] +find_directions [Check if the social security administration in pittsburgh can be reached in one hour by car from Carnegie Mellon University] +search_nearest_place [Tell me the closest cafe(s) to CMU Hunt library] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. If the OBJECTIVE is about finding directions from A to B, you MUST use find_directions [] subroutine. +e.g. find_directions [Check if the social security administration in pittsburgh can be reached in one hour by car from Carnegie Mellon University] +2. If the OBJECTIVE is about searching nearest place to a location, you MUST use search_nearest_place [] subroutine. +e.g. search_nearest_place [Tell me the closest restaurant(s) to Cohon University Center at Carnegie Mellon University] +3. If the OBJECTIVE is to pull up a description, once that place appears in the sidepane, return stop [N/A] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_directions = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [5h 47min] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. First click on "Find directions between two points", then enter From and To Fields, and click search. +2. If you have to find directions to social security administration in Pittsburgh, search for it in a structured format like Social Security Administration, Pittsburgh. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_nearest_place = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [De Fer Coffee & Tea, La Prima Espresso, Rothberg's Roasters II, Cafe Phipps, La Prima Espresso, Starbucks] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. For searches that refer to CMU, e.g. "find cafes near CMU Hunt Library" +a. You have to first center your map around a location. If you have to find cafes near CMU Hunt Library, the first step is to make sure the map is centered around Carnegie Mellon University. To do that, first search for Carnegie Mellon University and then click [] on a list of location that appears. You MUST click on the Carnegie Mellon University location to center the map. Else the map will not centered. E.g click [646] +b. Now that your map is centered around Carnegie Mellon University, directly search for "cafes near Hunt Library". Do not include the word CMU in the search item. +The word CMU cannot be parsed by maps and will result in an invalid search. +c. When your search returns a list of elements, return them in a structured format like stop [A, B, C] +2. For searches that don't refer to CMU +a. No need to center the map. Directly search what is specified in OBJECTIVE, e.g. "bars near Carnegie Music Hall" +b. When your search returns a list of elements, return them in a structured format like stop [A, B, C] +3. Be sure to double check whether the OBJECTIVE has CMU or not and then choose between instruction 1 and 2. +4. Remember that the word CMU cannot be typed in the search bar as it cannot be parsed by maps. +5. Remember that if you want to center your map around Carnegie Mellon University, you have to click on it after you search for it. Check your PREVIOUS ACTIONS to confirm you have done so, e.g. click [646] should be in the previous actions. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} \ No newline at end of file diff --git a/webagents_step/prompts/webarena/step_fewshot_template_adapted.py b/webagents_step/prompts/webarena/step_fewshot_template_adapted.py new file mode 100644 index 0000000..df40fcb --- /dev/null +++ b/webagents_step/prompts/webarena/step_fewshot_template_adapted.py @@ -0,0 +1,1396 @@ +github_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_commits [query]`: Given you are in a project page, this subroutine searches Gitlab for commits made to the project and retrieves information about a commit. This function returns the answer to the query. +`search_issues [query]`: Given you are in my issue page, this subroutine searches Gitlab to find issue that matches the query. Any objective that says "openn my latest issue" or "open issue with in the title" must be passed through this subroutine. +`create_project [query]`: Given you are in the create new project page, this subroutine completes the act of creating a project, adding members etc. +`create_group [query]`: Given you are in the create new group page, this subroutine completes the act of creating a group, adding members etc. + + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?] +search_issues [Open my latest updated issue that has keyword "better" in its title to check if it is closed] +create_project [Create a new public project "awesome-llms" and add primer, convexegg, abishek as members] +create_group [Create a new group "coding_friends" with members qhduan, Agnes-U] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response, e.g. 1 = find_commits [query] + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: + +* Use responses from your subroutine calls to answer the objective. The PREVIOUS ACTIONS section lists all previous actions and their corresponding responses. For instance, an entry of 1 = find_commits [query] implies that the find_commits subroutine you invoked returned a response of 1. Use that response to solve the objective. +* If the subroutine returns a response, e.g. Open = search_issues [query], and you have to issue a stop, then issue the same format as that of the response, e.g. stop [Open] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +How many commits did Mike Perotti make to diffusionProject on 03/23/2023? +OBSERVATION: +RootWebArea 'Projects · Dashboard · GitLab' focused: True + heading 'The diffusion / diffusionProject.com' + link [1522] 'The diffusion / diffusionProject.com +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. We are in the dashboard page. The task is to find how many commits Mike Perotti made to the diffusionProject. We have to first click on the project page. Once we are in the project page, we can use the find_commits subroutine. The id corresponding to the project page is 1522. In summary, the next action I will perform is ```click [1522]``` +ACTION: +click [1522] +"""}, +{ +"input": """ +OBJECTIVE: +How many commits did Mike Perotti make to diffusionProject on 03/23/2023? +OBSERVATION: +RootWebArea 'The diffusionProject · GitLab' focused: True + link [3014] '0' + link [3373] '2,320 Commits' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. We are in the diffusionProject page. The task is to find how many commits Mike Perotti made to the diffusionProject. Since we are in the project page, we can use the find_commits subroutine. In summary, the next action I will perform is ```find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?]``` +ACTION: +find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?] +""" +}, +] +} + +find_commits = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +stop [Mark made 2 commits on 07/08/2023] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?] +OBSERVATION: +RootWebArea 'The diffusionProject · GitLab' focused: True + link [3014] '0' + link [3373] '2,320 Commits' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. To find the number of commits made by Mike Perotti on a specific date, I need to navigate to the commits section of the repository. The link with the text '2,320 Commits' suggests that it leads to the commit history. Therefore, I will click on this link to proceed to the commits section. In summary, the next action I will perform is ```click [3373]``` +ACTION: +click [3373] +"""}, +{ +"input": """ +OBJECTIVE: +find_commits [How many commits did Mike Perotti make to diffusionProject on 03/23/2023?] +OBSERVATION: +text '23 Mar, 2023' +text '3 commits' +link [11366] "Emily Brick's avatar" +link [11369] 'Coverage improvements (#449)' +button [11371] 'Toggle commit description' +link [11380] 'Emily Brick' +time 'Mar 23, 2023 7:58pm EDT' +link [11440] 'Browse Files' +link [11451] "Mike Perrotti's avatar" +link [11454] 'updates guidance about numeric table values to be more specific (#451)' +link [11459] 'Mike Perrotti' +text ' authored ' +time 'Mar 23, 2023 2:58pm EDT' +button [13266] 'Unverified' +text 'da9575e5' +link [11469] 'Browse Files' +link [11480] "Cole Bemis's avatar" +link [11483] 'Add SSR compatibility to component lifecycle criteria (#440)' +link [11494] 'Cole Bemis' +time 'Mar 22, 2023 2:40pm EDT' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [3373] +""", +"response": """ +REASON: +Let's think step-by-step. I have already clicked on the link for commits. +From the browser content, I can see this is a list of commits for the diffusionProject. +I see that there has been 3 commits on 03/23/2023. I see that Mike Perrotti made 1 commit on Mar 23, 2023 2:58pm EDT. In summary, the next action I will perform is ```stop [1]``` +ACTION: +stop[1] +""" +}, +] +} + +search_issues = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [Closed] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} + +Please follow these general instructions: +1. By default you begin with the page containing all open issues. If the objective requires you to search over all issues, e.g. "Open my latest updated issue ... check if closed", make sure that you navigate to the page containing "all issues"". +2. If the objective says "Open ... issue to check if it is closed", this means: +a. First open the issue being referred to by clicking on it +b. Then return the status, i.e. stop [open], stop [closed]. +Do not return stop [] until you are sure that you have clicked on the issue. +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +Tab 0 (current): Issues \u00b7 Dashboard \u00b7 GitLab\n\nRootWebArea 'Issues \u00b7 Dashboard \u00b7 GitLab' focused: True\n\tlink [2241] 'Skip to content'\n\tlink [2295] 'Dashboard'\n\tbutton [4183] '' hasPopup: menu expanded: False\n\ttextbox [3082] 'Search GitLab' required: False\n\tgeneric [3025] 'Use the shortcut key / to start a search'\n\tlink [2367] 'Create new...'\n\tlink [2369] 'Issues'\n\t\tgeneric [2638] '13 assigned issues'\n\tlink [2370] 'Merge requests'\n\t\tgeneric [2640] '8 merge requests'\n\tlink [2372] 'To-Do List'\n\t\tgeneric [2656] 'Todos count'\n\tlink [2373] 'Help'\n\tlink [2375] 'Byte Blaze'\n\t\timg 'Byte Blaze'\n\tmain [2247] ''\n\t\theading 'Issues'\n\t\tlink [2332] 'Select project to create issue'\n\t\tbutton [2334] 'Toggle project select'\n\t\tlink [2335] 'Open 13'\n\t\tlink [2336] 'Closed 53'\n\t\tlink [2337] 'All 66'\n\t\tlink [2268] 'Subscribe to RSS feed'\n\t\tlink [2269] 'Subscribe to calendar'\n\t\tbutton [2390] 'Recent searches'\n\t\tbutton [3466] 'Assignee = Byte Blaze'\n\t\t\tbutton [4251] ''\n\t\ttextbox [3084] '' required: False\n\t\tbutton [3462] ''\n\t\tgroup [2282] ''\n\t\t\tbutton [3115] 'Updated date' hasPopup: listbox\n\t\t\tlink [2349] 'Sort direction'\n\t\tlink [4035] 'Tm Theme Editor' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: + +""", +"response": """ +REASON: +Let's think step-by-step. Since the objective is to search over all issues, first I need to navigate to the page containing All issues. Looking at the observation, I am not certain if I am seeing all issues. Hence, I must click the link with text link 'All 66' that suggests that it leads to the page with all issues. In summary, the next action I will perform is ```click [2337]``` +ACTION: +click [2337] +"""}, +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +Tab 0 (current): Issues \u00b7 Dashboard \u00b7 GitLab\n\nRootWebArea 'Issues \u00b7 Dashboard \u00b7 GitLab' focused: True\n\tlink [4622] 'Skip to content'\n\tlink [4631] 'Dashboard'\n\tbutton [6161] '' hasPopup: menu expanded: False\n\ttextbox [4383] 'Search GitLab' required: False\n\tgeneric [4660] 'Use the shortcut key / to start a search'\n\tlink [4680] 'Create new...'\n\tlink [4700] 'Issues'\n\t\tgeneric [4702] '13 assigned issues'\n\tlink [4707] 'Merge requests'\n\t\tgeneric [4710] '8 merge requests'\n\tlink [4732] 'To-Do List'\n\t\tgeneric [4734] 'Todos count'\n\t\t\ttext '5'\n\tlink [4739] 'Help'\n\tlink [4780] 'Byte Blaze'\n\t\timg 'Byte Blaze'\n\tmain [4387] ''\n\t\theading 'Issues'\n\t\tlink [4843] 'Select project to create issue'\n\t\tbutton [4844] 'Toggle project select'\n\t\tlink [4862] 'Open 13'\n\t\tlink [4867] 'Closed 53'\n\t\tlink [4872] 'All 66'\n\t\tlink [4877] 'Subscribe to RSS feed'\n\t\tlink [4878] 'Subscribe to calendar'\n\t\tbutton [4894] 'Recent searches'\n\t\tbutton [4400] 'Assignee = Byte Blaze'\n\t\t\tbutton [4946] ''\n\t\ttextbox [4398] '' required: False\n\t\tbutton [4893] ''\n\t\tgroup [5199] ''\n\t\t\tbutton [5202] 'Updated date' hasPopup: listbox\n\t\t\tlink [5201] 'Sort direction'\n\t\tlink [5299] 'Tm Theme Editor'\n\t\ttext 'byteblaze/a11y-syntax-highlighting#1 '\n\t\ttext '\u00b7 created '\n\t\ttime 'Apr 2, 2020 12:13am EDT'\n\t\t\ttext '3 years ago'\n\t\ttext ' by '\n\t\tlink [5305] 'earle'\n\t\tlink [5312] 'Assigned to Byte Blaze'\n\t\tlink [5314] ' 14'\n\t\ttext 'updated '\n\t\ttime 'Mar 27, 2023 7:15pm EDT'\n\t\t\t[5321] +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2337] +""", +"response": """ +REASON: +Let's think step-by-step. I see all issues on the current page. Given the objective, I must search for issues that contain the keyword "homepage content". To do this, I will type the keyword into the search input textbox that appears just before the list of issues. In summary, the next action I will perform is ```type [4398] [homepage content] [1]``` +ACTION: +type [4398] [homepage content] [1] +""" +}, +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +'\n\t\ttext '\u00b7 created '\n\t\ttime 'Jul 15, 2020 2:48pm EDT'\n\t\t\ttext '3 years ago'\n\t\ttext ' by '\n\t\tlink [7144] 'Byte Blaze'\n\t\ttext ' \\xa0 '\n\t\tlink [7147] 'bug'\n\t\tlink [7149] 'claimed'\n\t\tlink [7151] 'redesign'\n\t\tlink [7153] 'styling'\n\t\ttext 'CLOSED'\n\t\tlink [7170] 'Assigned to Byte Blaze'\n\t\tlink [7172] ' 4'\n\t\ttext 'updated '\n\t\ttime 'Mar 23, 2023 4:40am EDT'\n\t\t\ttext '10 months ago'\n\t\tlink [7182] \"Rethink the homepage's content\"\n\t\ttext 'a11yproject/a11yproject.com#719 '\n\t\ttext '\u00b7 created '\n\t\ttime 'Dec 30, 2018 2:42pm EST'\n\t\t\ttext '5 years ago'\n\t\ttext ' by '\n\t\tlink [7188] 'Byte Blaze'\n\t\ttext '\\xa0 '\n\t\tlink [7191] ' Content Updates for 2019'\n\t\ttext ' \\xa0 '\n\t\tlink [7194] 'enhancement'\n\t\tlink [7196] 'redesign'\n\t\ttext 'CLOSED'\n\t\tlink [7214] 'Assigned to Byte Blaze'\n\t\tlink [7216] ' 5'\n\t\ttext 'updated '\n\t\ttime 'Mar 23, 2023 4:39am EDT'\n\t\t\ttext +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2337] +type [4398] [homepage content] [1] +""", +"response": """ +REASON: +Let's think step-by-step. I see one issue called "Rethink the homepage's content" that contains the keywords "homepage content". Since it is only one issue, it must be the latest updated issue. According to the general instructions, since the objective asks me to open the issue, I must click the issue. In summary, the next action I will perform is ```click [7182]``` +ACTION: +click [7182] +""" +}, +{ +"input": """ +OBJECTIVE: +search_issues [Open my latest updated issue that has keyword \"homepage content\" in its title to check if it is closed] +OBSERVATION: +button 'Collapse sidebar'\n\t[8080] navigation 'Breadcrumbs'\n\t\tlink [8095] 'The A11Y Project'\n\t\tlink [8101] 'a11yproject.com'\n\t\tlink [8108] 'Issues'\n\t\tlink [8114] '#719'\n\tmain [7383] ''\n\t\ttext 'Closed'\n\t\ttext 'Issue created '\n\t\ttime 'Dec 30, 2018 7:42pm'\n\t\ttext ' by' +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2337] +type [4398] [homepage content] [1] +click [7182] +""", +"response": """ +REASON: +The observation indicates that the issue titled \"Rethink the homepage's content (#719)\" is already open in the current tab. There is also a text element with the text 'Closed' (id 8138), which suggests that the status of the issue is visible on the page. Therefore, no further navigation or clicks are required to complete the task. Hence, I must stop and return the desired response. In summary, the next action I will perform is ```stop [Closed]``` +ACTION: +"stop [Closed]" +""" +}, +] +} + +create_project = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these general instructions: +1. To add new members, once you have created the project, click on Project Information in the sidebar to be guided to a link with memmbers. +2. When adding members, first type their name, then click on their name from the down down. Consult PREVIOUS ACTIONS to see if you have typed and selected the names. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +{ +"input": """ +OBJECTIVE: +create_project [Create a new public project \"awesome-llms\" and add primer, convexegg, abishek as members] +OBSERVATION: +Tab 0 (current): Byte Blaze / awesome-llms \u00b7 GitLab\n\nRootWebArea 'Byte Blaze / awesome-llms \u00b7 GitLab' focused: True\n\tlink [35051] 'Skip to content'\n\tlink [35060] 'Dashboard'\n\tbutton [36630] '' hasPopup: menu expanded: False\n\ttextbox [34985] 'Search GitLab' required: False\n\tgeneric [35092] 'Use the shortcut key / to start a search'\n\tlink [35112] 'Create new...'\n\tlink [35151] 'Issues'\n\t\tgeneric [35153] '13 assigned issues'\n\tlink [35158] 'Merge requests'\n\t\tgeneric [35161] '8 merge requests'\n\tlink [35183] 'To-Do List'\n\t\tgeneric [35185] 'Todos count'\n\tlink [35190] 'Help'\n\tlink [35231] 'Byte Blaze'\n\t\timg 'Byte Blaze'\n\tcomplementary [35287] 'Project navigation'\n\t\tlistitem 'awesome-llms'\n\t\t\tlink [35313] 'awesome-llms'\n\t\t\t\ttext 'A'\n\t\tlink [35319] 'Project information'\n\t\tlink [35345] 'Repository'\n\t\tlink [35387] 'Issues'\n\t\t\ttext '0'\n\t\tlink [35421] 'Merge requests'\n\t\tlink [35438] 'CI/CD'\n\t\tlink [35468] 'Security & Compliance'\n\t\tlink [35486] 'Deployments'\n\t\tlink [35512] 'Packages and registries'\n\t\tlink [35534] 'Infrastructure'\n\t\tlink [35560] 'Monitor'\n\t\tlink [35590] 'Analytics'\n\t\tlink [35616] 'Wiki'\n\t\tlink [35629] 'Snippets'\n\t\tlink [35642] 'Settings'\n\t\tbutton [35290] 'Collapse sidebar'\n\tgeneric [4817] 'Public - The project can be accessed without any authentication.'\n\t\ttext 'Project ID: 195 '\n\t\tbutton [4824] 'Copy project ID' live: polite atomic: False relevant: additions text\n\t\tbutton [5115] '' hasPopup: menu expanded: False\n\t\tbutton [4833] 'Star'\n\t\tlink [4834] '0'\n\t\tlink [4844] 'Fork'\n\t\tlink [4843] '0'\n\t\tlink [4857] '1 Commit'\n\t\tlink [4865] '1 Branch'\n\t\tlink [4873] '0 Tags'\n\t\tlink [4881] '72 KB Project Storage'\n\t\tlink [6112] ''\n\t\tlink [6119] 'Initial commit'\n\t\t[6122] +URL: +https://localhost:8023/ +PREVIOUS ACTIONS: +click [2782] +type [3910] [awesome-llms] [0] +click [3903] +""", +"response": """ +REASON: +Let's think step-by-step. The task is to create a new public project named "awesome-llms" and add members to it. However, based on the observation, it appears that the project "awesome-llms" has already been created, as indicated by the presence of elements such as 'Project ID: 195' and 'Initial commit'. The next step is to add members to the project. To do this, I need to navigate to the project information which contains a link to add members. The link to 'Project information' is present in the observation with id 35319. In summary, the next action I will perform is ```click [35319]``` +ACTION: +click [35319] +"""}, +] +} + +create_group = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these general instructions: +1. To add new members, click on the Members tab in the side pane. If you don't see it, click on Group Information in the sidebar to be guided to a link with memmbers. +2. When adding members, first type their name, then click on their name from the down down. Consult PREVIOUS ACTIONS to see if you have typed and selected the names. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +reddit_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_subreddit [query]`: Find a subreddit corresponding to the query. The query can either be the name of the subreddit or a vague description of what the subreddit may contain. The subroutine hands back control once it navigates to the subreddit. +`find_user [user_name]`: Navigate to the page of a user with user_name. The page contains all the posts made by the user. + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +find_subreddit [books] +find_subreddit [something related to driving in Pittsburgh] +find_user [AdamCannon] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. If you have to do a task related to a particular user, first find the user using find_user subroutine +2. Otherwise, if you have to post or edit a post in a subreddit, first find the subreddit using the find_subreddit subroutine +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_subreddit = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective find_subreddit [query] asks you to navigate to the subreddit that best matches the query. The query can be specific or vague. +2. To navigate to a subreddit, first click on Forums from the top menu. +3. Once you are in the Forums page, and you see the Alphabetical option, click on it to see a list of all subreddits alphabetically. +4. Once you are in the page with all the subreddits listed alphabetically, click on the subreddit that matches the query +5. Once you have navigated to the subreddit, return stop [N/A]. You can check that you are in the subreddit by looking at the current observation and seeing "heading '/f/subreddit_name'". You will also see a number of posts. If the subreddit_name vaguely matches the query, it means you are already in the subreddit and should stop, e.g. gaming and games are the same subreddit. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_user = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [issue] [1] +stop [N/A] +goto [http://localhost:9999/user/] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective find_user [user_name] asks you to navigate the page of a user with user_name +2. To do so, look at the current base URL (e.g. http://localhost:9999) and add a suffix /user/user_name, i.e. +goto [http://localhost:9999/user/user_name] +3. Once you have navigated to the user page (as seen in your past actions), return stop [N/A] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +shopping_admin_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_customer_review [query]`: Find customer reviews for a particular product using the query to specify the kind of review. +`find_order [query]`: Find an order corresponding to a particular customer or order number. +`search_customer [query]`: Find a customer given some details about them such as their phone number. + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +find_customer_review [Show me customer reviews for Zoe products] +find_order [Most recent pending order by Sarah Miller] +find_order [Order 305] +search_customer [Search customer with phone number 8015551212] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. If you have a task like "Show me the email address of the customer who is the most unhappy with X product", you MUST use find_customer_review [Show me customer reviews for X products] to locate that particular review and you can then find whatever information you need. Do not try to solve the task without using the subroutine as it contains specific instructions on how to solve it. +2. If you have a task like "Show me the customers who have expressed dissatisfaction with X product", you MUST use find_customer_review [Show me customer reviews for X product]. +3. If you have a task about a particular order, e.g. "Notify X in their most recent pending order with message Y", you MUST use find_order [Most recent pending order for X] to locate the order, and then do operations on that page. +4. To write a comment on the order page, you MUST NOT click on "Comments History" tab, it does not lead you to the right place. Stay on the current page and check the comment section. +5. If you have a task about a particular order, e.g. "Cancel order 305", you MUST use find_order [Find order 305] to locate the order, and then do operations on that page. +6. If you have a task like "Find the customer name and email with phone number X", you MUST use search_customer [Search customer with phone number X] to locate the customer, and then answer the query. Do NOT click on CUSTOMERS side panel. +7. You MUST use Subroutine Actions whenever possible. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_customer_review = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective find_customer_review [query] asks you to navigate to the product page containing customer reviews. +2. To navigate to a review, first click on REPORTS in the side panel +3. Once you have clicked on REPORTS, and you see the Reports panel with Marketing, Sales, Reviews, Customers etc, click on By Products under Customers. +4. Once you are in the Product Reviews Report, you need to locate the product by searching for it. Use the gridcell below Product to search for a product. Do not use other search boxes. Look at the example below where I show you how to search for Zoe in the correct gridcell. +5. When searching for a product, search the first word only like Zoe, or Antonia or Chloe. +6. Once the product shows up, click on 'Show Reviews'. +7. Once all the reviews show up, return stop [N/A] to hand back control to the agent that queried you. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ + { +"input": """ +OBJECTIVE: +find_product_review [Show me the review of the customer who is the most unhappy with the style of Zoe products] +OBSERVATION: +Tab 0 (current): Product Reviews Report / Reviews / Reports / Magento Admin + table '' + row '| ID | Product | Reviews | Average | Average (Approved) | Last Review | Action |' + row '| --- | --- | --- | --- | --- | --- | --- |' + row "| textbox [1996] [required: False] | textbox [1998] [required: False] | textbox [2000] [required: False] | textbox [2002] [required: False] | textbox [2004] [required: False] | undefined undefined\ttextbox [2008] 'From' [required: False]\tbutton [3196] 'undefined'\ttextbox [2010] 'To' [required: False]\tbutton [3201] 'undefined' | |" + row 'https://localhost:7780/admin/review/product/index/productId/1620/' + row "| 1620 | Erica Evercool Sports Bra | 4 | 60.0000 | 60.0000 | Apr 19, 2023, 12:15:17 PM | Show Reviews\tlink [2792] 'Show + row 'https://localhost:7780/admin/review/product/index/productId/39/' + row "| 39 | +URL: +https://localhost:7780/admin/reports/report_review/product/ +PREVIOUS ACTIONS: +click [1195] +click [1531] +""", +"response": """ +REASON: +Let's think step-by-step. We are in the Product Review Report page. We have to search for a Zoe product. To do so, I have to type in Zoe in a gridcell corresponding to the Product column. The Product column is the second column after ID. Therefore I have to find the second gridcell just below it. The first one is 1995, and the second one is 1997. In summary, the next action I will perform is type [1997] [Zoe] [1] +ACTION: +type [1997] [Zoe] [1] +"""}, +] +} + +find_order = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective find_order [query] asks you to navigate to the order page corresponding to the query +2. To navigate to orders, first click on SALES in the side panel +3. Once you have clicked on SALES, click on Orders. +4. Once you are in the orders page, you have to use the 'Search by keyword' text box to search for your order. Always be sure to search first. For example, for find_order [Most recent pending order by Sarah Miller], search Sarah Miller. +5. Click on View to open the right order. +6. Once you are in the order page, as noted by "Order & Account Information", you MUST return stop [N/A] to hand back control to the agent that queried you. Do not go back to another page. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_customer = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. The objective search_customer [query] asks you to search for customer details corresponding to the query +2. To navigate to customers, first click on CUSTOMERS in the side panel +3. Once you have clicked on CUSTOMERS, click on All Customers. +4. Once you are in the customers page, you have to use the 'Search by keyword' text box to search for your customer. Always be sure to search first. For example, for find_order [Search customer with phone number 8015551212], search 8015551212. +5. If the page shows a number has already been searched, click on Clear All first. Then proceed with the search. +6. Once you are done with the search, and the customer with matching query shows up, you MUST return stop [N/A] to hand back control to the agent that queried you. Do not go back to another page. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +shopping_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`search_order [question]`: Search orders to answer a question about my orders +`find_products [query]`: Find products that match a query +`search_reviews [query]`: Search reviews to answer a question about reviews + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +stop [Closed] +hover [11] +search_order [How much I spend on 4/19/2023 on shopping at One Stop Market?] +list_products [List products from PS4 accessories category by ascending price] +search_reviews [List out reviewers, if exist, who mention about ear cups being small] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. First check thhe OBJECTIVE. If the OBJECTIVE is a question about my orders, you MUST use search_order [question] to answer the question. For example, +a. search_order [How much I spend on ...?] +b. search_order [What is the size of the picture frame I bought Sep 2022?] +c. search_order [Change the delivery address for my most recent order] +Do not click on MyAccount directly! +Do not try to solve the task without using search_order as it contains specific instructions on how to solve it. +2. Once you call the search_order [] subroutine, the response is stored in PREVIOUS ACTIONS. For example, +$0 = search_order [How much I spend on 4/19/2023 on shopping at One Stop Market?] +means that the response was $0. In that case, return the answer directly, e.g. stop [$0] +If the response was N/A, reply stop [N/A] +3. If the OBJECTIVE is a question about listing / showing products, you MUST use list_products. For example, +a. list_products [List products from PS4 accessories category by ascending price] +4. If the OBJECTIVE requires you to retrieve details about a particular order you placed liked SKU, you MUST first use search_order [] to retrieve the SKU +a. If the OBJECTIVE is "Fill the "contact us" form in the site for a refund on the bluetooth speaker I bought ... Also, ensure to include the order number #161 and the product SKU." +you must first issue search_order [Give me the SKU of bluetooth speaker from order number #161] +b. If the OBJECTIVE is "Draft a refund message via their "contact us" form for the phone screen protector I bought March 2023. It broke after three days of use. The shop requires the order id, the reason and the amount to refund in the message." +you must first issue search_order [Give me the order id and the amount for the phone screen protector I bought March 2023.] +5. If the OBJECTIVE is about reviews for the product, you MUST use search_reviews. For example, +a. search_reviews [List out reviewers, if exist, who mention about ear cups being small] +b. search_reviews [What are the main criticisms of this product? Please extract the relevant sentences] +6. In your REASON, you MUST specify if any of the general instructions above apply that would affect the action you choose. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_order = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`note [content]`: Use this to make a personal note of some content you would like to remember. This shows up in your history of previous actions so you can refer to it. +`go_back`: Navigate to the previously viewed page. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +note [Spent $10 on 4/1/2024] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. Navigate to My Account, then My Orders to access all orders +2. The orders are sorted by descending date. Use Page Next to navigate to orders placed at an earlier date than displayed. Use Page Previous to navigate to orders at a later date than displayed. +click [id] corresponding to Page Previous to go to a later date +click [id] corresponding to Page Next to go to a earlier date +3. If you don't see an order for a date, and the first order on the page is after the date, the last order on the page is before the date, then it means there is no order for the date. No point navigating to previous or next pages. +4. If the question is how much did I spend on a date, and I didn't spend anything, return stop [$0] +5. If the status of an order shows cancelled, that means I did not spend that money +6. If you have to find the total amount you spent on orders that span multiple pages, use note [Spent $10 on 4/1/2024] to make a personal note before moving on to the next page. When you are done, you can look at PREVIOUS ACTIONS to find all notes. +7. When you are adding numbers, work out each addition step by step in REASON. +8. Use go_back to go back to a previous page from an order. +But before you do, use note [] to make a note that you checked the page, e.g. +note [Checked order on 11/29/2023, no picture frame.] +9. If you are asked to change the delivery address on an order, you can't. Reply stop [N/A] +10. If you are in an order page and need to go back, issue go_back. +Don't click on My Orders else you have to start from all over again. +11. Do not keep visiting the same order page over and over again! +To prevent this, whenever you visit a page, always make a note. For example note [Nothing relevant purchased on September 29, 2022] +See note [] to see what dates you have visit, and be sure to not visit that page again. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +list_products = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. Use this whenever any element has the field hasPopup: menu +`goto [url]`: Navigate to a specific URL. Use this when needing to sort by price. Refer to instructions below. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [N/A] +hover [77] +goto [https://localhost:7770/video-games/playstation-4/accessories.html?product_list_order=price] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. To find a product category, you MUST use hover [id] to expand the popup Menu till you find the leaf element that has no popup. Then click [id] on the leaf element. +For exmaple, to find PS 4 accessories you must hover over Video Games, then hover over Playstation 4, then click on Accessories. +2. To sort current list of products by price and in ascending order, you MUST use the goto [url] action by appending ?product_list_order=price to the current URL. For example: +If URL is https://localhost:7770/video-games/playstation-4/accessories.html +then issue goto [https://localhost:7770/video-games/playstation-4/accessories.html?product_list_order=price] +3. To sort in descending order, you MUST use the goto [url] action by appending ?product_list_order=price&product_list_dir=desc, e.g. +If URL is https://localhost:7770/video-games/playstation-4/accessories.html +goto [https://localhost:7770/video-games/playstation-4/accessories.html?product_list_order=price&product_list_dir=desc] +4. To list all items less than a particular price, e.g. $25, you MUST use the goto [url] action by appending ?price=0-25 +If URL is https://localhost:7770/video-games/playstation-4/accessories.html +goto [https://localhost:7770/video-games/playstation-4/accessories.html?price=0-25] +5. Once you are done in stop [N/A] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_reviews = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`note [content]`: Use this to make a personal note of some content you would like to remember. This shows up in your history of previous actions so you can refer to it. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +note [Reviewer X made comment Y] +stop [N/A] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. To find the list of reviews, search for a link with Reviewers. +2. If you have to list multiple reviewers, use `note [Reviewer X made comment Y; Reviewer A made comment B; ...]` to make a personal note. When you are done, you can look at PREVIOUS ACTIONS to find all notes. In stop [], make sure you answer the question in the OBJECTIVE. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +maps_agent = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Subroutine Actions: +`find_directions [query]`: Find directions between two locations to answer the query +`search_nearest_place [query]`: Find places near a given location + +Example actions: +click [7] +type [15] [Carnegie Mellon University] [1] +find_directions [Check if the social security administration in pittsburgh can be reached in one hour by car from Carnegie Mellon University] +search_nearest_place [Tell me the closest cafe(s) to CMU Hunt library] + +You will be provided with the following, + OBJECTIVE: + The goal you need to achieve. + OBSERVATION: + A simplified text description of the current browser content, without formatting elements. + URL: + The current webpage URL + PREVIOUS ACTIONS: + A list of your past actions with an optional response + +You need to generate a response in the following format. Please issue only a single action at a time. + REASON: + Your reason for selecting the action below + ACTION: + Your action + +Please follow these general instructions: +1. If the OBJECTIVE is about finding directions from A to B, you MUST use find_directions [] subroutine. +e.g. find_directions [Check if the social security administration in pittsburgh can be reached in one hour by car from Carnegie Mellon University] +2. If the OBJECTIVE is about searching nearest place to a location, you MUST use search_nearest_place [] subroutine. +e.g. search_nearest_place [Tell me the closest restaurant(s) to Cohon University Center at Carnegie Mellon University] +3. If the OBJECTIVE is to pull up a description, once that place appears in the sidepane, return stop [N/A] +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +find_directions = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [5h 47min] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. First click on "Find directions between two points", then enter From and To Fields, and click search. +2. If you have to find directions to social security administration in Pittsburgh, search for it in a structured format like Social Security Administration, Pittsburgh. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} + +search_nearest_place = { +"instruction": """You are an AI assistant performing tasks on a web browser. To solve these tasks, you will issue specific actions. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Example actions: +click [7] +type [7] [Zoe] [1] +stop [De Fer Coffee & Tea, La Prima Espresso, Rothberg's Roasters II, Cafe Phipps, La Prima Espresso, Starbucks] + +You will be provided with the following, +OBJECTIVE: +The goal you need to achieve. +OBSERVATION: +A simplified text description of the current browser content, without formatting elements. +URL: +The current webpage URL +PREVIOUS ACTIONS: +A list of your past actions + +You need to generate a response in the following format. Please issue only a single action at a time. +REASON: +Your reason for selecting the action below +ACTION: +Your action + +Please follow these instructions to solve the subtask: +1. For searches that refer to CMU, e.g. "find cafes near CMU Hunt Library" +a. You have to first center your map around a location. If you have to find cafes near CMU Hunt Library, the first step is to make sure the map is centered around Carnegie Mellon University. To do that, first search for Carnegie Mellon University and then click [] on a list of location that appears. You MUST click on the Carnegie Mellon University location to center the map. Else the map will not centered. E.g click [646] +b. Now that your map is centered around Carnegie Mellon University, directly search for "cafes near Hunt Library". Do not include the word CMU in the search item. +The word CMU cannot be parsed by maps and will result in an invalid search. +c. When your search returns a list of elements, return them in a structured format like stop [A, B, C] +2. For searches that don't refer to CMU +a. No need to center the map. Directly search what is specified in OBJECTIVE, e.g. "bars near Carnegie Music Hall" +b. When your search returns a list of elements, return them in a structured format like stop [A, B, C] +3. Be sure to double check whether the OBJECTIVE has CMU or not and then choose between instruction 1 and 2. +4. Remember that the word CMU cannot be typed in the search bar as it cannot be parsed by maps. +5. Remember that if you want to center your map around Carnegie Mellon University, you have to click on it after you search for it. Check your PREVIOUS ACTIONS to confirm you have done so, e.g. click [646] should be in the previous actions. +""", + +"input": """ +OBJECTIVE: +{objective} +OBSERVATION: +{observation} +URL: +{url} +PREVIOUS ACTIONS: +{previous_actions} +""", + +"response": "", + +"examples": [ +] +} diff --git a/webagents_step/utils/data_prep.py b/webagents_step/utils/data_prep.py new file mode 100644 index 0000000..e3647eb --- /dev/null +++ b/webagents_step/utils/data_prep.py @@ -0,0 +1,137 @@ +import os +import json +import pandas as pd +import random +import yaml +import copy +import numpy as np + +class yamlConfig: + def __init__(self, dictionary): + for key, value in dictionary.items(): + if isinstance(value, dict): + value = yamlConfig(value) + setattr(self, key, value) + +class DotDict: + """access dictionary attributes with dot notation""" + def __init__(self, dictionary): + for key, value in dictionary.items(): + if isinstance(value, dict): + value = DotDict(value) + setattr(self, key, value) + + def to_dict(self): + regular_dict = {} + for key, value in self.__dict__.items(): + if isinstance(value, DotDict): + regular_dict[key] = value.to_dict() + else: + regular_dict[key] = value + return regular_dict + + def has_key(self, key): + """Check if the DotDict has a specific key""" + return hasattr(self, key) + +##### +# Dataset processing functions +##### + +def split_list_by_proportion(proportion, original_list): + list_size = len(original_list) + first_list_size = int(proportion * list_size) + shuffled_list = copy.copy(original_list) + random.shuffle(shuffled_list) + first_list = shuffled_list[:first_list_size] + second_list = shuffled_list[first_list_size:] + return first_list, second_list + + +def examples_to_prompts(data_config, json_df, prompt_template, inference): + all_prompt_strings = [] + for idx, row in json_df.iterrows(): + try: + # read samples + json_filepath = os.path.join(data_config.basedir, str(row.logfile)) + with open(json_filepath,'r') as json_file: + example_json = json.load(json_file) + all_prompt_strings.extend(convert_example_to_prompts(example_json, data_config, prompt_template, inference)) + except FileNotFoundError: + print(f"File {data_config.basedir}/{row.logfile} not found. Skipping ...") + continue + + return all_prompt_strings + +def convert_example_to_prompts(example_json, data_config, prompt_template, inference): + filled_prompt_strings = [] + previous_actions = [] + for step_ind, step in enumerate(example_json["trajectory"]): + # Fill in prompt components + prompt_components = copy.deepcopy(prompt_template) + prompt_components["input"] = prompt_components["input"].format( + objective = step["objective"], + observation = step["observation"], + url = step["url"], + previous_actions = "\n".join([str(step) for step in step["previous_actions"][-data_config.action_lookback:] if step is not None]) if "previous_actions" in step else "\n".join([str(action) for action in previous_actions[-data_config.action_lookback:] if action is not None]) + ) + previous_actions.append(step["action"]) + + prompt_components["response"] = convert_actions_and_reasons_to_response(step["reason"], step["action"]) + filled_prompt_strings.append(create_prompt(prompt_components, inference=inference)) + return filled_prompt_strings + +def convert_actions_and_reasons_to_response(reasons, actions): + response = f""" +REASON: +{reasons} +ACTION: +{actions} +""" + return response + +def create_prompt(prompt_components, inference=False): + #If inference mode, do not fill in the response + if inference: + prompt_template = """ +[INST] <> +{instruction} +<> + +{input} [/INST]""" + return prompt_template.format(instruction = prompt_components["instruction"], + input = prompt_components["input"]) + else: + prompt_template = """ +[INST] <> +{instruction} +<> + +{input} [/INST] {response} +""" + return prompt_template.format(instruction = prompt_components["instruction"], + input = prompt_components["input"], + response = prompt_components["response"]) + +def log_run(log_file, log_data, summary_file=None, summary_data=None, json_indent=4, verbose=1): + """ + Logs demo data to a JSON file and optionally updates a summary CSV file. + """ + # Write log data to JSON file + with open(log_file, 'w') as json_file: + json.dump(log_data, json_file, indent=json_indent) + if verbose: + print(f"Saved log to {log_file}") + + # If summary data and file path are provided, update the summary + if summary_data and summary_file: + if os.path.exists(summary_file): + df_summary = pd.read_csv(summary_file) + else: + df_summary = pd.DataFrame() + df_summary = pd.concat([df_summary, pd.DataFrame([summary_data])], ignore_index=True) + df_summary.to_csv(summary_file, index=False) + if verbose: + print(f"Updated summary: {df_summary}") + + return df_summary \ No newline at end of file diff --git a/webagents_step/utils/llm.py b/webagents_step/utils/llm.py new file mode 100644 index 0000000..1aac13a --- /dev/null +++ b/webagents_step/utils/llm.py @@ -0,0 +1,422 @@ +import openai +import re +import copy +import torch +from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + BitsAndBytesConfig, + AutoModelForSeq2SeqLM, +) +import ctranslate2 +from time import sleep +import tiktoken +from openai import OpenAI + +import warnings +warnings.simplefilter("ignore") + +input_token_cost_usd_by_model = { + "gpt-4-1106-preview": 0.01 / 1000, + "gpt-4": 0.03 / 1000, + "gpt-4-32k": 0.06 / 1000, + "gpt-3.5-turbo": 0.001 / 1000, + "gpt-3.5-turbo-instruct": 0.0015 / 1000, + "gpt-3.5-turbo-16k": 0.003 / 1000, + "babbage-002": 0.0016 / 1000, + "davinci-002": 0.012 / 1000, + "ada-v2": 0.0001 / 1000, +} + +output_token_cost_usd_by_model = { + "gpt-4-1106-preview": 0.03 / 1000, + "gpt-4": 0.06 / 1000, + "gpt-4-32k": 0.12 / 1000, + "gpt-3.5-turbo": 0.002 / 1000, + "gpt-3.5-turbo-instruct": 0.002 / 1000, + "gpt-3.5-turbo-16k": 0.004 / 1000, + "babbage-002": 0.0016 / 1000, + "davinci-002": 0.012 / 1000, + "ada-v2": 0.0001 / 1000, +} + +def fill_prompt_template(prompt_template, objective, observation, url, previous_history): + prompt = copy.deepcopy(prompt_template) + prompt["input"] = prompt["input"].replace("{objective}", objective) + if isinstance(observation, dict): + prompt["input"] = prompt["input"].replace("{observation}", observation["text"]) + else: + prompt["input"] = prompt["input"].replace("{observation}", observation) + prompt["input"] = prompt["input"].replace("{url}", url) + prompt["input"] = prompt["input"].replace("{previous_actions}", previous_history) + return prompt + +def filter_quotes_if_matches_template(action): + if action is None: + return None + + # Regex pattern to match the entire 'type [X] ["Y"]' template, allowing for Y to be digits as well + pattern = r'^type \[\d+\] \["([^"\[\]]+)"\]$' + # Check if the action matches the specific template + match = re.match(pattern, action) + if match: + # Extract the matched part that needs to be unquoted + y_part = match.group(1) + # Reconstruct the action string without quotes around Y + filtered_action = f'type [{match.group(0).split("[")[1].split("]")[0]}] [{y_part}]' + return filtered_action.strip() # filtered_action.split("\n")[0].strip() + else: + # Return the original action if it doesn't match the template + return action.strip() # action.split("\n")[0].strip() + +def parse_action_reason(model_response): + reason_match = re.search(r'REASON:\s*(.*?)\s*(?=\n[A-Z]|$)', model_response, re.DOTALL) + reason = reason_match.group(1) if reason_match else None + + # action_match = re.search(r'ACTION:\s*(.*?)\s*(?=\n[A-Z]|$)', model_response, re.DOTALL) + action_match = re.search(r'(?:ACTION|ACTIONS):\s*(.*?)\s*(?=\n[A-Z]|$)', model_response, re.DOTALL) + action = action_match.group(1) if action_match else None + + action = filter_quotes_if_matches_template(action) + + return action, reason + +def construct_llm_message_hf(prompt, prompt_mode, model_type="llama2"): + if model_type == "llama2": + instruction = "[INST] " + prompt["instruction"] + else: + instruction = prompt["instruction"] + + messages = [{"role": "system", "content": instruction}] + + if prompt["examples"]: + messages.append({"role": "system", "content": "Here are a few examples:"}) + for example in prompt["examples"]: + messages.append({"role": "system", "content": f"\n### Input:\n{example['input']}\n\n### Response:\n{example['response']}"}) + + if model_type == "llama2": + query = f"\nHere is the current Input. Please respond with REASON and ACTION.\n### Input:\n{prompt['input']}\n[/INST]\n" + else: + query = f"\nHere is the current Input. Please respond with REASON and ACTION.\n### Input:\n{prompt['input']}\n\n### Response:" + + messages.append({"role": "user", "content": query}) + if prompt_mode == "chat": + return messages + elif prompt_mode == "completion": + all_content = ''.join(message['content'] for message in messages) + messages_completion = [{"role": "user", "content": all_content}] + return messages_completion + +def construct_llm_message_anthropic(prompt, plan_list=None, action_list=None): + if plan_list and action_list: + import os + from global_utils import CURRENT_DIR + + assert len(plan_list) > 0 and len(action_list) > 0 + plan_instructions = "\n".join(["".join(open(os.path.join(CURRENT_DIR, "prompts", "plan_instructions", f"{p}.txt"), "r").readlines()) for p in plan_list]) + action_instructions = "\n".join(["".join(open(os.path.join(CURRENT_DIR, "prompts", "action_instructions", f"{a}.txt"), "r").readlines()) for a in action_list]) + prompt["instruction"] = prompt["instruction"].replace("{plan_instructions}", plan_instructions) + prompt["instruction"] = prompt["instruction"].replace("{action_instructions}", action_instructions) + + system_message = prompt["instruction"] + + if prompt["examples"]: + system_message += f"\n\n## Here are a few examples:" + for i, example in enumerate(prompt["examples"]): + example_input = example["input"] + example_response = example["response"] + if "example_format" in prompt.keys(): + system_message += "\n\n" + system_message += prompt["example_format"].replace("{i}", i).replace("{example_input}", example_input).replace("{example_response}", example_response) + else: + system_message += f"\n\n| Example {i}\n\n### Input:\n{example_input}\n\n### Response: Let's think step by step.\n{example_response}" + + if "input_format" in prompt.keys(): + if "{visual_observation}" in prompt.keys(): + from claude import arrange_message_for_claude + text = prompt["input_format"].replace("{input}", prompt['input']) + text_prior, text_subsequent = text.split("{visual_observation}") + messages = arrange_message_for_claude([("text", text_prior), ("image", prompt["{visual_observation}"]), ("text", text_subsequent)]) + else: + messages = [{"role": "user", "content": [{"type": "text", "text": prompt["input_format"].replace("{input}", prompt['input'])}]}] + else: + if "{visual_observation}" in prompt.keys(): + pass + else: + messages = [{"role": "user", "content": [{"type": "text", "text": f"## Here is the current Input. Please respond with REASON and ACTION.\n### Input:\n{prompt['input']}\n\n### Response:"}]}] + + return system_message, messages + +def construct_llm_message_openai(prompt, prompt_mode, plan_list=None, action_list=None): + if not (plan_list and action_list): + messages = [{"role": "system", "content": prompt["instruction"]}] + + if prompt["examples"]: + messages.append({"role": "system", "content": "Here are a few examples:"}) + for example in prompt["examples"]: + messages.append({"role": "system", "content": f"\n### Input:\n{example['input']}\n\n### Response:\n{example['response']}"}) + + messages.append({"role": "user", "content": f"Here is the current Input. Please respond with REASON and ACTION.\n### Input:\n{prompt['input']}\n\n### Response:"}) + if prompt_mode == "chat": + return messages + elif prompt_mode == "completion": + all_content = ''.join(message['content'] for message in messages) + messages_completion = [{"role": "user", "content": all_content}] + return messages_completion + import os + from global_utils import CURRENT_DIR + + assert len(plan_list) > 0 and len(action_list) > 0 + plan_instructions = "\n".join(["".join(open(os.path.join(CURRENT_DIR, "prompts", "plan_instructions", f"{p}.txt"), "r").readlines()) for p in plan_list]) + action_instructions = "\n".join(["".join(open(os.path.join(CURRENT_DIR, "prompts", "action_instructions", f"{a}.txt"), "r").readlines()) for a in action_list]) + prompt["instruction"] = prompt["instruction"].replace("{plan_instructions}", plan_instructions) + prompt["instruction"] = prompt["instruction"].replace("{action_instructions}", action_instructions) + + messages = [{"role": "system", "content": prompt["instruction"]}] + + if prompt["examples"]: + messages.append({"role": "system", "content": "## Here are a few examples:"}) + for i, example in enumerate(prompt["examples"]): + example_input = example["input"] + example_response = example["response"] + messages.append({"role": "system", "content": f"| Example {i}\n\n### Input:\n{example_input}\n\n### Response: Let's think step by step.\n{example_response}"}) + + if "input_format" in prompt.keys(): + messages.append({"role": "user", "content": prompt["input_format"].replace("{input}", prompt['input'])}) + else: + messages.append({"role": "user", "content": f"## Here is the current Input. Please respond with PLAN, REASON and ACTION.\n### Input:\n{prompt['input']}\n\n### Response:"}) + if prompt_mode == "chat": + return messages + elif prompt_mode == "completion": + all_content = ''.join(message['content'] for message in messages) + messages_completion = [{"role": "user", "content": all_content}] + return messages_completion + +def call_anthropic_llm(system_message, messages, model="anthropic.claude-3-haiku-20240307-v1:0", **model_kwargs): + # Use the native inference API to send a text message to Anthropic Claude. + + import boto3 + import json + + # Create a Bedrock Runtime client in the AWS Region of your choice. + client = boto3.client("bedrock-runtime", region_name="us-east-1") + print(system_message, file=open("trash.txt", "a")) + print("\n".join(item["content"][0]["text"] for item in messages), end="\n"+"#"*100+"\n", file=open("trash.txt", "a")) + native_request = { + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 512, + "temperature": 0.5, + "system": system_message, + "messages": messages, + } + + # Convert the native request to JSON. + request = json.dumps(native_request) + + try: + # Invoke the model with the request. + response = client.invoke_model(modelId=model, body=request) + + except Exception as e: + raise KeyError(f"ERROR: Can't invoke '{model}'. Reason: {e}") + + # Decode the response body. + model_response = json.loads(response["body"].read()) + + # Extract and print the response text. + response_text = model_response["content"][0]["text"] + return response_text + +def call_openai_llm(messages, model="gpt-3.5-turbo", **model_kwargs): + """ + Sends a request with a chat conversation to OpenAI's chat API and returns a response. + + Parameters: + messages (list) + A list of dictionaries containing the messages to send to the chatbot. + model (str) + The model to use for the chatbot. Default is "gpt-3.5-turbo". + temperature (float) + The temperature to use for the chatbot. Defaults to 0. Note that a temperature + of 0 does not guarantee the same response (https://platform.openai.com/docs/models/gpt-3-5). + + Returns: + response (Optional[dict]) + The response from OpenAI's chat API, if any. + """ + # client = OpenAI() + temperature = model_kwargs.get('temperature', 0.7) + top_p = model_kwargs.get('top_p', 1.0) + n = model_kwargs.get('n', 1) + + for m in messages: + print(m["content"], file=open("trash.txt", "a")) + print("*"*100, file=open("trash.txt", "a")) + + num_attempts = 0 + while True: + if num_attempts >= 10: + raise ValueError("OpenAI request failed.") + try: + if model=="text-davinci-003": + response = openai.Completion.create( + model=model, + prompt=messages[0]["content"], + temperature=temperature, + top_p=top_p, + n=n, + max_tokens=128) + return response.choices[0].text.strip() + + response = OpenAI().chat.completions.create( + model=model, + messages=messages, + temperature=temperature, + top_p=top_p, + n=n + ) + return response.choices[0].message.content.strip() + except openai.AuthenticationError as e: + print(e) + return None + except openai.RateLimitError as e: + print(e) + print("Sleeping for 10 seconds...") + sleep(10) + num_attempts += 1 + except Exception as e: + print(e) + print("Sleeping for 10 seconds...") + sleep(10) + num_attempts += 1 + +def get_num_tokens(text: str, model_name: str) -> int: + tokenizer = tiktoken.encoding_for_model(model_name=model_name) + return len(tokenizer.encode_ordinary(text)) + +def calculate_cost_openai(messages: str, response: str, model_name: str) -> int: + input_text = " ".join([msg["content"] for msg in messages]) + num_input_tokens = get_num_tokens(input_text, model_name) + num_output_tokens = get_num_tokens(response, model_name) + + input_token_cost = input_token_cost_usd_by_model.get(model_name, None) + output_token_cost = output_token_cost_usd_by_model.get(model_name, None) + if input_token_cost is None or output_token_cost is None: + print(f"[calculate_cost_openai] unknown model {model_name}") + return 0 + return num_input_tokens * input_token_cost + num_output_tokens * output_token_cost + +def load_tokenizer(mpath, context_size): + tokenizer = AutoTokenizer.from_pretrained(mpath, return_token_type_ids=False) + # tokenizer.pad_token = tokenizer.eos_token + # tokenizer.pad_token_id = tokenizer.eos_token_id + # tokenizer.model_max_length = context_size + # tokenizer.padding_side = "right" + # tokenizer.truncation_side = "left" + # tokenizer.add_eos_token = True + return tokenizer + +def load_model(mpath, dtype, device="cuda", context_len=4096, is_seq2seq=False, ct2_mpath=None): + if is_seq2seq: + model_loader = AutoModelForSeq2SeqLM + else: + model_loader = AutoModelForCausalLM + + if dtype == "bf16": + model = model_loader.from_pretrained( + mpath, + max_position_embeddings=context_len, + low_cpu_mem_usage=True, + torch_dtype=torch.bfloat16, + device_map="balanced_low_0", + ) + elif dtype == "4bit": + model = model_loader.from_pretrained( + mpath, + max_position_embeddings=context_len, + low_cpu_mem_usage=True, + load_in_4bit=True, + device_map="auto", + ) + elif dtype == "4bit-optimized": + bnb_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_use_double_quant=True, + bnb_4bit_quant_type="nf4", + bnb_4bit_compute_dtype=torch.bfloat16, + ) + model = model_loader.from_pretrained( + mpath, + use_cache=True, + device_map="auto", + quantization_config=bnb_config, + max_position_embeddings=context_len, + ) + elif dtype == "8bit": + model = model_loader.from_pretrained( + mpath, + max_position_embeddings=context_len, + low_cpu_mem_usage=True, + load_in_8bit=True, + device_map="auto", + ) + elif dtype == "ct2": + assert ct2_mpath is not None + model = ctranslate2.Generator(ct2_mpath, device=device) + + return model + +# @torch.no_grad() +# def generate_prediction( +# inputs, +# model, +# tokenizer, +# max_new_tokens, +# is_seq2seq=False, +# **kwargs, +# # num_beams, +# # do_sample, +# # no_repeat_ngram_size, +# # temperature, +# # top_k, +# # top_p, +# ): +# input_ids = tokenizer(inputs, return_tensors="pt", truncation=True, max_length=tokenizer.model_max_length - max_new_tokens).input_ids + +# outputs = model.generate( +# input_ids=input_ids.cuda(), +# max_new_tokens=max_new_tokens, +# **kwargs, +# ).cpu() + +# torch.cuda.empty_cache() +# if not is_seq2seq: +# outputs = outputs[:, input_ids.shape[1] :] + +# prediction = [ +# p.split(tokenizer.pad_token, 1)[0] +# for p in tokenizer.batch_decode(outputs, skip_special_tokens=True) +# ][0].strip() + +# return prediction + +def generate_prediction( + inputs, + model, + tokenizer, + **kwargs, +): + inputs = tokenizer([inputs], return_tensors='pt', truncation=True, add_special_tokens=False).to(model.device) + + # if torch.cuda.is_available(): + # inputs = inputs.to('cuda') + outputs = model.generate( + input_ids=inputs['input_ids'], + attention_mask=inputs['attention_mask'], + **kwargs, + ) + + outputs = outputs[:, inputs.input_ids.shape[1] :] + prediction = tokenizer.decode(outputs[0], skip_special_tokens=True) + + return prediction \ No newline at end of file diff --git a/webagents_step/utils/stack.py b/webagents_step/utils/stack.py new file mode 100644 index 0000000..8944891 --- /dev/null +++ b/webagents_step/utils/stack.py @@ -0,0 +1,22 @@ +class Stack: + def __init__(self): + self.items = [] + + def is_empty(self): + return len(self.items) == 0 + + def push(self, item): + self.items.append(item) + + def pop(self): + if self.is_empty(): + raise IndexError("pop from empty stack") + return self.items.pop() + + def peek(self): + if self.is_empty(): + raise IndexError("peek from empty stack") + return self.items[-1] + + def size(self): + return len(self.items) \ No newline at end of file diff --git a/webarena/agent/__init__.py b/webarena/agent/__init__.py new file mode 100644 index 0000000..9028d30 --- /dev/null +++ b/webarena/agent/__init__.py @@ -0,0 +1,8 @@ +from .agent import ( + Agent, + PromptAgent, + TeacherForcingAgent, + construct_agent, +) + +__all__ = ["Agent", "TeacherForcingAgent", "PromptAgent", "construct_agent"] diff --git a/webarena/agent/agent.py b/webarena/agent/agent.py new file mode 100644 index 0000000..490d08e --- /dev/null +++ b/webarena/agent/agent.py @@ -0,0 +1,227 @@ +import argparse +import json +from typing import Any + +import tiktoken +from beartype import beartype + +from agent.prompts import * +from browser_env import Trajectory +from browser_env.actions import ( + Action, + ActionParsingError, + create_id_based_action, + create_none_action, + create_playwright_action, +) +from browser_env.utils import Observation, StateInfo +from llms import ( + call_llm, + generate_from_huggingface_completion, + generate_from_openai_chat_completion, + generate_from_openai_completion, + lm_config, +) +from llms.tokenizers import Tokenizer + + +class Agent: + """Base class for the agent""" + + def __init__(self, *args: Any) -> None: + pass + + def next_action( + self, trajectory: Trajectory, intent: str, meta_data: Any + ) -> Action: + """Predict the next action given the observation""" + raise NotImplementedError + + def check_action( + self, trajectory: Trajectory, intent: str, meta_data: dict[str, Any], target_action: str + ) -> Action: + """Predict the next action given the observation""" + raise NotImplementedError + + def reset( + self, + test_config_file: str, + ) -> None: + raise NotImplementedError + + +class TeacherForcingAgent(Agent): + """Agent that follows a pre-defined action sequence""" + + def __init__(self) -> None: + super().__init__() + + def set_action_set_tag(self, tag: str) -> None: + self.action_set_tag = tag + + def set_actions(self, action_seq: str | list[str]) -> None: + if isinstance(action_seq, str): + action_strs = action_seq.strip().split("\n") + else: + action_strs = action_seq + action_strs = [a.strip() for a in action_strs] + + actions = [] + for a_str in action_strs: + try: + if self.action_set_tag == "playwright": + cur_action = create_playwright_action(a_str) + elif self.action_set_tag == "id_accessibility_tree": + cur_action = create_id_based_action(a_str) + else: + raise ValueError( + f"Unknown action type {self.action_set_tag}" + ) + except ActionParsingError as e: + cur_action = create_none_action() + + cur_action["raw_prediction"] = a_str + actions.append(cur_action) + + self.actions: list[Action] = actions + + def next_action( + self, trajectory: Trajectory, intent: str, meta_data: Any + ) -> Action: + """Predict the next action given the observation""" + return self.actions.pop(0) + + def reset( + self, + test_config_file: str, + ) -> None: + with open(test_config_file) as f: + ref_actions = json.load(f)["reference_action_sequence"] + tag = ref_actions["action_set_tag"] + action_seq = ref_actions["action_sequence"] + self.set_action_set_tag(tag) + self.set_actions(action_seq) + + +class PromptAgent(Agent): + """prompt-based agent that emits action given the history""" + + @beartype + def __init__( + self, + action_set_tag: str, + lm_config: lm_config.LMConfig, + prompt_constructor: PromptConstructor, + ) -> None: + super().__init__() + self.lm_config = lm_config + self.prompt_constructor = prompt_constructor + self.action_set_tag = action_set_tag + + def set_action_set_tag(self, tag: str) -> None: + self.action_set_tag = tag + + @beartype + def next_action( + self, trajectory: Trajectory, intent: str, meta_data: dict[str, Any] + ) -> Action: + prompt = self.prompt_constructor.construct( + trajectory, intent, meta_data + ) + lm_config = self.lm_config + n = 0 + while True: + response = call_llm(lm_config, prompt) + force_prefix = self.prompt_constructor.instruction[ + "meta_data" + ].get("force_prefix", "") + response = f"{force_prefix}{response}" + n += 1 + try: + parsed_response = self.prompt_constructor.extract_action( + response + ) + if self.action_set_tag in ["id_html_tree", "id_html_nasc_tree", "id_accessibility_tree"]: + action = create_id_based_action(parsed_response) + elif self.action_set_tag == "playwright": + action = create_playwright_action(parsed_response) + else: + raise ValueError( + f"Unknown action type {self.action_set_tag}" + ) + action["raw_prediction"] = response + break + except ActionParsingError as e: + if n >= lm_config.gen_config["max_retry"]: + action = create_none_action() + action["raw_prediction"] = response + break + + return action + + def check_action( + self, trajectory: Trajectory, intent: str, meta_data: dict[str, Any], target_action: str + ) -> Action: + prompt = self.prompt_constructor.construct( + trajectory, intent, meta_data + ) + lm_config = self.lm_config + n = 0 + + # agent will retry if the action is not parsed correctly + while True: + response = target_action + force_prefix = self.prompt_constructor.instruction[ + "meta_data" + ].get("force_prefix", "") + response = f"{force_prefix}{response}" + n += 1 + try: + parsed_response = self.prompt_constructor.extract_action( + response + ) + if self.action_set_tag in ["id_accessibility_tree", "id_html_tree", "id_html_nasc_tree"]: + action = create_id_based_action(parsed_response) + elif self.action_set_tag == "playwright": + action = create_playwright_action(parsed_response) + else: + raise ValueError( + f"Unknown action type {self.action_set_tag}" + ) + action["raw_prediction"] = response + break + except ActionParsingError as e: + if n >= lm_config.gen_config["max_retry"]: + action = create_none_action() + action["raw_prediction"] = response + break + + return prompt, action + + def reset(self, test_config_file: str) -> None: + pass + + +def construct_agent(args: argparse.Namespace) -> Agent: + llm_config = lm_config.construct_llm_config(args) + + agent: Agent + if args.agent_type == "teacher_forcing": + agent = TeacherForcingAgent() + elif args.agent_type == "prompt": + with open(args.instruction_path) as f: + constructor_type = json.load(f)["meta_data"]["prompt_constructor"] + tokenizer = Tokenizer(args.provider, args.model) + prompt_constructor = eval(constructor_type)( + args.instruction_path, lm_config=llm_config, tokenizer=tokenizer + ) + agent = PromptAgent( + action_set_tag=args.action_set_tag, + lm_config=llm_config, + prompt_constructor=prompt_constructor, + ) + else: + raise NotImplementedError( + f"agent type {args.agent_type} not implemented" + ) + return agent diff --git a/webarena/agent/prompts/__init__.py b/webarena/agent/prompts/__init__.py new file mode 100644 index 0000000..3f3caba --- /dev/null +++ b/webarena/agent/prompts/__init__.py @@ -0,0 +1 @@ +from .prompt_constructor import * diff --git a/webarena/agent/prompts/jsons/new_action_prompt.json b/webarena/agent/prompts/jsons/new_action_prompt.json new file mode 100644 index 0000000..d477d0c --- /dev/null +++ b/webarena/agent/prompts/jsons/new_action_prompt.json @@ -0,0 +1,21 @@ +{ + "intro": "", + "examples": [], + "template": " {html} \n\nYou are a helpful assistant that can assist with web navigation tasks.\nYou are given a simplified html webpage and a task description.\nYour goal is to complete the task. You can use the provided functions below to interact with the current webpage.\n\n#Provided functions:\ndef click(element_id: str) -> None:\n \"\"\"\n Click on the element with the specified id.\n\n Args:\n element_id: The id of the element.\n \"\"\"\n\ndef hover(element_id: str) -> None:\n \"\"\"\n Hover on the element with the specified id.\n\n Args:\n element_id: The id of the element.\n \"\"\"\n\ndef select(element_id: str, option: str) -> None:\n \"\"\"\n Select an option from a dropdown.\n\n Args:\n element_id: The id of the element.\n option: Value of the option to select.\n \"\"\"\n\ndef type_string(element_id: str, content: str, press_enter: bool) -> None:\n \"\"\"\n Type a string into the element with the specified id.\n\n Args:\n element_id: The id of the element.\n content: The string to type.\n press_enter: Whether to press enter after typing the string.\n \"\"\"\n\ndef scroll_page(direction: Literal['up', 'down']) -> None:\n \"\"\"\n Scroll down/up one page.\n\n Args:\n direction: The direction to scroll.\n \"\"\"\n\ndef go(direction: Literal['forward', 'backward']) -> None:\n \"\"\"\n Go forward/backward\n\n Args:\n direction: The direction to go to.\n \"\"\"\n\ndef jump_to(url: str, new_tab: bool) -> None:\n \"\"\"\n Jump to the specified url.\n\n Args:\n url: The url to jump to.\n new_tab: Whether to open the url in a new tab.\n \"\"\"\n\ndef switch_tab(tab_index: int) -> None:\n \"\"\"\n Switch to the specified tab.\n\n Args:\n tab_index: The index of the tab to switch to.\n \"\"\"\n\ndef user_input(message: str) -> str:\n \"\"\"\n Wait for user input.\n\n Args:\n message: The message to display to the user.\n\n Returns: The user input.\n \"\"\"\n\ndef finish(answer: Optional[str]) -> None:\n \"\"\"\n Finish the task (optionally with an answer).\n\n Args:\n answer: The answer to the task.\n \"\"\"\n\n#Previous commands: {previous_action}\n\n#Window tabs: {tabs}\n\n#Current viewport (pages): {position}\n\n#Task: {objective}\n\nYou should output one command to interact to the currrent webpage.\nYou should add a brief comment to your command to explain your reasoning and thinking process.\n", + "finale": "", + "meta_data": { + "observation": "html", + "action_type": "id_html_nasc_tree", + "keywords": [ + "url", + "html", + "objective", + "position", + "previous_action", + "tabs" + ], + "prompt_constructor": "NewASPromptConstructor", + "answer_phrase": "", + "action_splitter": "#" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/jsons/p_cot_id_actree_2s.json b/webarena/agent/prompts/jsons/p_cot_id_actree_2s.json new file mode 100644 index 0000000..9d2eae4 --- /dev/null +++ b/webarena/agent/prompts/jsons/p_cot_id_actree_2s.json @@ -0,0 +1,27 @@ +{ + "intro": "You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue.\n\nHere's the information you'll have:\nThe user's objective: This is the task you're trying to complete.\nThe current web page's accessibility tree: This is a simplified representation of the webpage, providing key information.\nThe current web page's URL: This is the page you're currently navigating.\nThe open tabs: These are the tabs you have open.\nThe previous action: This is the action you just performed. It may be helpful to track your progress.\n\nThe actions you can perform fall into several categories:\n\nPage Operation Actions:\n`click [id]`: This action clicks on an element with a specific id on the webpage.\n`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the \"Enter\" key is pressed after typing unless press_enter_after is set to 0.\n`hover [id]`: Hover over an element with id.\n`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v).\n`scroll [direction=down|up]`: Scroll the page up or down.\n\nTab Management Actions:\n`new_tab`: Open a new, empty browser tab.\n`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index.\n`close_tab`: Close the currently active tab.\n\nURL Navigation Actions:\n`goto [url]`: Navigate to a specific URL.\n`go_back`: Navigate to the previously viewed page.\n`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed).\n\nCompletion Action:\n`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as \"N/A\" in the bracket.\n\nHomepage:\nIf you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit.\nhttp://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites.\n\nTo be successful, it is very important to follow the following rules:\n1. You should only issue an action that is valid given the current observation\n2. You should only issue one action at a time.\n3. You should follow the examples to reason step by step and then issue the next action.\n4. Generate the action in the correct format. Start with a \"In summary, the next action I will perform is\" phrase, followed by action inside ``````. For example, \"In summary, the next action I will perform is ```click [1234]```\".\n5. Issue stop action when you think you have achieved the objective. Don't generate anything after stop.", + "examples": [ + [ + "OBSERVATION:\n[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)'\n\t\t[1749] StaticText '$279.49'\n\t\t[1757] button 'Add to Cart'\n\t\t[1760] button 'Add to Wish List'\n\t\t[1761] button 'Add to Compare'\nURL: http://onestopmarket.com/office-products/office-electronics.html\nOBJECTIVE: What is the price of HP Inkjet Fax Machine\nPREVIOUS ACTION: None", + "Let's think step-by-step. This page list the information of HP Inkjet Fax Machine, which is the product identified in the objective. Its price is $279.49. I think I have achieved the objective. I will issue the stop action with the answer. In summary, the next action I will perform is ```stop [$279.49]```" + ], + [ + "OBSERVATION:\n[164] textbox 'Search' focused: True required: False\n[171] button 'Go'\n[174] link 'Find directions between two points'\n[212] heading 'Search Results'\n[216] button 'Close'\nURL: http://openstreetmap.org\nOBJECTIVE: Show me the restaurants near CMU\nPREVIOUS ACTION: None", + "Let's think step-by-step. This page has a search box whose ID is [164]. According to the nominatim rule of openstreetmap, I can search for the restaurants near a location by \"restaurants near\". I can submit my typing by pressing the Enter afterwards. In summary, the next action I will perform is ```type [164] [restaurants near CMU] [1]```" + ] + ], + "template": "OBSERVATION:\n{observation}\nURL: {url}\nOBJECTIVE: {objective}\nPREVIOUS ACTION: {previous_action}", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": [ + "url", + "objective", + "observation", + "previous_action" + ], + "prompt_constructor": "CoTPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/jsons/p_cot_id_actree_2s_no_na.json b/webarena/agent/prompts/jsons/p_cot_id_actree_2s_no_na.json new file mode 100644 index 0000000..6b0f23f --- /dev/null +++ b/webarena/agent/prompts/jsons/p_cot_id_actree_2s_no_na.json @@ -0,0 +1,27 @@ +{ + "intro": "You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue.\n\nHere's the information you'll have:\nThe user's objective: This is the task you're trying to complete.\nThe current web page's accessibility tree: This is a simplified representation of the webpage, providing key information.\nThe current web page's URL: This is the page you're currently navigating.\nThe open tabs: These are the tabs you have open.\nThe previous action: This is the action you just performed. It may be helpful to track your progress.\n\nThe actions you can perform fall into several categories:\n\nPage Operation Actions:\n`click [id]`: This action clicks on an element with a specific id on the webpage.\n`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the \"Enter\" key is pressed after typing unless press_enter_after is set to 0.\n`hover [id]`: Hover over an element with id.\n`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v).\n`scroll [direction=down|up]`: Scroll the page up or down.\n\nTab Management Actions:\n`new_tab`: Open a new, empty browser tab.\n`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index.\n`close_tab`: Close the currently active tab.\n\nURL Navigation Actions:\n`goto [url]`: Navigate to a specific URL.\n`go_back`: Navigate to the previously viewed page.\n`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed).\n\nCompletion Action:\n`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket.\n\nHomepage:\nIf you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit.\nhttp://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites.\n\nTo be successful, it is very important to follow the following rules:\n1. You should only issue an action that is valid given the current observation\n2. You should only issue one action at a time.\n3. You should follow the examples to reason step by step and then issue the next action.\n4. Generate the action in the correct format. Start with a \"In summary, the next action I will perform is\" phrase, followed by action inside ``````. For example, \"In summary, the next action I will perform is ```click [1234]```\".\n5. Issue stop action when you think you have achieved the objective. Don't generate anything after stop.", + "examples": [ + [ + "OBSERVATION:\n[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)'\n\t\t[1749] StaticText '$279.49'\n\t\t[1757] button 'Add to Cart'\n\t\t[1760] button 'Add to Wish List'\n\t\t[1761] button 'Add to Compare'\nURL: http://onestopmarket.com/office-products/office-electronics.html\nOBJECTIVE: What is the price of HP Inkjet Fax Machine\nPREVIOUS ACTION: None", + "Let's think step-by-step. This page list the information of HP Inkjet Fax Machine, which is the product identified in the objective. Its price is $279.49. I think I have achieved the objective. I will issue the stop action with the answer. In summary, the next action I will perform is ```stop [$279.49]```" + ], + [ + "OBSERVATION:\n[164] textbox 'Search' focused: True required: False\n[171] button 'Go'\n[174] link 'Find directions between two points'\n[212] heading 'Search Results'\n[216] button 'Close'\nURL: http://openstreetmap.org\nOBJECTIVE: Show me the restaurants near CMU\nPREVIOUS ACTION: None", + "Let's think step-by-step. This page has a search box whose ID is [164]. According to the nominatim rule of openstreetmap, I can search for the restaurants near a location by \"restaurants near\". I can submit my typing by pressing the Enter afterwards. In summary, the next action I will perform is ```type [164] [restaurants near CMU] [1]```" + ] + ], + "template": "OBSERVATION:\n{observation}\nURL: {url}\nOBJECTIVE: {objective}\nPREVIOUS ACTION: {previous_action}", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": [ + "url", + "objective", + "observation", + "previous_action" + ], + "prompt_constructor": "CoTPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/jsons/p_direct_id_actree_2s.json b/webarena/agent/prompts/jsons/p_direct_id_actree_2s.json new file mode 100644 index 0000000..d336a03 --- /dev/null +++ b/webarena/agent/prompts/jsons/p_direct_id_actree_2s.json @@ -0,0 +1,26 @@ +{ + "intro": "You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue.\n\nHere's the information you'll have:\nThe user's objective: This is the task you're trying to complete.\nThe current web page's accessibility tree: This is a simplified representation of the webpage, providing key information.\nThe current web page's URL: This is the page you're currently navigating.\nThe open tabs: These are the tabs you have open.\nThe previous action: This is the action you just performed. It may be helpful to track your progress.\n\nThe actions you can perform fall into several categories:\n\nPage Operation Actions:\n`click [id]`: This action clicks on an element with a specific id on the webpage.\n`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the \"Enter\" key is pressed after typing unless press_enter_after is set to 0.\n`hover [id]`: Hover over an element with id.\n`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v).\n`scroll [direction=down|up]`: Scroll the page up or down.\n\nTab Management Actions:\n`new_tab`: Open a new, empty browser tab.\n`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index.\n`close_tab`: Close the currently active tab.\n\nURL Navigation Actions:\n`goto [url]`: Navigate to a specific URL.\n`go_back`: Navigate to the previously viewed page.\n`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed).\n\nCompletion Action:\n`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as \"N/A\" in the bracket.\n\nHomepage:\nIf you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit.\nhttp://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites.\n\nTo be successful, it is very important to follow the following rules:\n1. You should only issue an action that is valid given the current observation\n2. You should only issue one action at a time.\n3. Generate the action in the correct format. Always put the action inside a pair of ```. For example, ```click [1234]```.\n5. Issue stop action when you think you have achieved the objective. Don't generate anything after stop.", + "examples": [ + [ + "OBSERVATION:\n[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)'\n\t\t[1749] StaticText '$279.49'\n\t\t[1757] button 'Add to Cart'\n\t\t[1760] button 'Add to Wish List'\n\t\t[1761] button 'Add to Compare'\nURL: http://onestopmarket.com/office-products/office-electronics.html\nOBJECTIVE: What is the price of HP Inkjet Fax Machine\nPREVIOUS ACTION: None", + "```stop [$279.49]```" + ], + [ + "OBSERVATION:\n[164] textbox 'Search' focused: True required: False\n[171] button 'Go'\n[174] link 'Find directions between two points'\n[212] heading 'Search Results'\n[216] button 'Close'\nURL: http://openstreetmap.org\nOBJECTIVE: Show me the restaurants near CMU\nPREVIOUS ACTION: None", + "```type [164] [restaurants near CMU] [1]```" + ] + ], + "template": "OBSERVATION:\n{observation}\nURL: {url}\nOBJECTIVE: {objective}\nPREVIOUS ACTION: {previous_action}", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": [ + "url", + "objective", + "observation", + "previous_action" + ], + "prompt_constructor": "DirectPromptConstructor", + "action_splitter": "```" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/jsons/p_direct_id_actree_2s_no_na.json b/webarena/agent/prompts/jsons/p_direct_id_actree_2s_no_na.json new file mode 100644 index 0000000..ac3306f --- /dev/null +++ b/webarena/agent/prompts/jsons/p_direct_id_actree_2s_no_na.json @@ -0,0 +1,27 @@ +{ + "intro": "You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue.\n\nHere's the information you'll have:\nThe user's objective: This is the task you're trying to complete.\nThe current web page's accessibility tree: This is a simplified representation of the webpage, providing key information.\nThe current web page's URL: This is the page you're currently navigating.\nThe open tabs: These are the tabs you have open.\nThe previous action: This is the action you just performed. It may be helpful to track your progress.\n\nThe actions you can perform fall into several categories:\n\nPage Operation Actions:\n`click [id]`: This action clicks on an element with a specific id on the webpage.\n`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the \"Enter\" key is pressed after typing unless press_enter_after is set to 0.\n`hover [id]`: Hover over an element with id.\n`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v).\n`scroll [direction=down|up]`: Scroll the page up or down.\n\nTab Management Actions:\n`new_tab`: Open a new, empty browser tab.\n`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index.\n`close_tab`: Close the currently active tab.\n\nURL Navigation Actions:\n`goto [url]`: Navigate to a specific URL.\n`go_back`: Navigate to the previously viewed page.\n`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed).\n\nCompletion Action:\n`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket.\n\nHomepage:\nIf you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit.\nhttp://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites.\n\nTo be successful, it is very important to follow the following rules:\n1. You should only issue an action that is valid given the current observation\n2. You should only issue one action at a time.\n4. Generate the action in the correct format, wrap the action inside ``````. For example, ```click [1234]```\".\n5. Issue stop action when you think you have achieved the objective.", + "examples": [ + [ + "OBSERVATION:\n[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)'\n\t\t[1749] StaticText '$279.49'\n\t\t[1757] button 'Add to Cart'\n\t\t[1760] button 'Add to Wish List'\n\t\t[1761] button 'Add to Compare'\nURL: http://onestopmarket.com/office-products/office-electronics.html\nOBJECTIVE: What is the price of HP Inkjet Fax Machine\nPREVIOUS ACTION: None", + "```stop [$279.49]```" + ], + [ + "OBSERVATION:\n[164] textbox 'Search' focused: True required: False\n[171] button 'Go'\n[174] link 'Find directions between two points'\n[212] heading 'Search Results'\n[216] button 'Close'\nURL: http://openstreetmap.org\nOBJECTIVE: Show me the restaurants near CMU\nPREVIOUS ACTION: None", + "```type [164] [restaurants near CMU] [1]```" + ] + ], + "template": "OBSERVATION:\n{observation}\nURL: {url}\nOBJECTIVE: {objective}\nPREVIOUS ACTION: {previous_action}", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": [ + "url", + "objective", + "observation", + "previous_action" + ], + "prompt_constructor": "CoTPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/jsons/p_direct_id_actree_3s_llama.json b/webarena/agent/prompts/jsons/p_direct_id_actree_3s_llama.json new file mode 100644 index 0000000..f87f09f --- /dev/null +++ b/webarena/agent/prompts/jsons/p_direct_id_actree_3s_llama.json @@ -0,0 +1,32 @@ +{ + "intro": "You are an autonomous intelligent agent tasked with navigating a web browser. The actions you can perform fall into several categories:\n\nPage Operation Actions:\n`click [id]`: This action clicks on an element with a specific id on the webpage.\n`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the \"Enter\" key is pressed after typing unless press_enter_after is set to 0.\n`hover [id]`: Hover over an element with id.\n`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v).\n`scroll [direction=down|up]`: Scroll the page up or down.\n\nTab Management Actions:\n`new_tab`: Open a new, empty browser tab.\n`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index.\n`close_tab`: Close the currently active tab.\n\nURL Navigation Actions:\n`goto [url]`: Navigate to a specific URL.\n`go_back`: Navigate to the previously viewed page.\n`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed).\n\nCompletion Action:\n`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket.\n\nHomepage:\nIf you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit.\n\nYou can only issue one action at a time", + "examples": [ + [ + "Observation:\n[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)'\n\t[1749] StaticText '$279.49'\n\t[1757] button 'Add to Cart'\n\t[1760] button 'Add to Wish List'\n\t[1761] button 'Add to Compare'\nURL: http://onestopmarket.com/office-products/office-electronics.html\nObjective: What is the price of HP Inkjet Fax Machine\nPrevious action: None", + "```stop [$279.49]```" + ], + [ + "Observation:\n[164] textbox 'Search' focused: True required: False\n[171] button 'Go'\n[174] link 'Find directions between two points'\n[212] heading 'Search Results'\n[216] button 'Close'\nURL: http://openstreetmap.org\nObjective: Show me the restaurants near CMU\nPrevious action: None", + "```type [164] [restaurants near CMU] [1]```" + ], + [ + "Observation:\n[2036] button 'Sort by: New' hasPopup: menu expanded: False\n\t[587] link 'US Marine\u2019s adoption of Afghan war orphan voided'\n\t\t[989] time 'March 30, 2023 at 15:03:48 AM UTC'\n\t[602] link 'York student uses AI chatbot to get parking fine revoked'\n\t\t[1025] time 'March 15, 2023 at 7:48:34 AM UTC'\n\t[617] link 'Loveland parents furious after teachers leave, communication lagged during school threat investigation'\n\t\t[1025] time 'March 2, 2023 at 3:46:01 AM UTC'\nURL: http://reddit.com/f/news/new\nObjective: Open the most recent post that was published prior to March 1st.\nPrevious action: None", + "```scroll [down]```" + ] + ], + "template": "Observation:\n{observation}\nURL: {url}\nObjective: {objective}\nPrevious action: {previous_action}", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": [ + "url", + "objective", + "observation", + "previous_action" + ], + "prompt_constructor": "DirectPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```", + "force_prefix": "```" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/jsons/test_prompt.json b/webarena/agent/prompts/jsons/test_prompt.json new file mode 100644 index 0000000..e227938 --- /dev/null +++ b/webarena/agent/prompts/jsons/test_prompt.json @@ -0,0 +1,20 @@ +{ + "intro": "", + "examples": [], + "template": " {html} \n\nYou are a helpful assistant that can assist with web navigation tasks.\nYou are given a simplified html webpage and a task description. \nYour goal is to complete the task. You can perform the specified operations below to interact with the webpage.\n\n#Valid operations: - #Click# id: Click on the element with the specified id\n- #Scroll_up#: Scroll up 1 page.\n- #Scroll_down#: Scroll down 1 page.\n- #Go_backward#: Go back to the previous page.\n- #Go_forward#: Go forward to the next page.\n- #Hover# id: Hover over the element with the specified id.\n- #Type# id \"text\": Type in the text at the element with the specified id.\n- #Select# id \"option\": Select the option at the element with the specified id.\n- #Record# \"content\": Mark content that is useful in answering the question.\n- #Answer# \"text\": output the text as the answer to the user.\n- #Exit#: Complete the task and exit the program.\n\n#Current viewport position: {position}\n\n#Previous Operation: {previous_action}\n\n#Task: {objective}\n", + "finale": "\nYour output SHOULD be in the following format:\n#Operation: {Next operation to perform}\n", + "meta_data": { + "observation": "html", + "action_type": "id_html_tree", + "keywords": [ + "url", + "html", + "objective", + "position", + "previous_action" + ], + "prompt_constructor": "MyPromptConstructor", + "answer_phrase": "", + "action_splitter": "#" + } +} \ No newline at end of file diff --git a/webarena/agent/prompts/prompt_constructor.py b/webarena/agent/prompts/prompt_constructor.py new file mode 100644 index 0000000..039b87c --- /dev/null +++ b/webarena/agent/prompts/prompt_constructor.py @@ -0,0 +1,683 @@ +import json +import re +from pathlib import Path +from typing import Any, TypedDict + +from browser_env import Action, ActionParsingError, Trajectory +from browser_env.env_config import URL_MAPPINGS +from browser_env.utils import StateInfo +from llms import lm_config +from llms.tokenizers import Tokenizer +from llms.utils import APIInput + + +class Instruction(TypedDict): + """Instruction for constructing prompt""" + + intro: str + examples: list[tuple[str, str]] + template: str + meta_data: dict[str, Any] + + +class PromptConstructor(object): + def __init__( + self, + instruction_path: str | Path, + lm_config: lm_config.LMConfig, + tokenizer: Tokenizer, + ): + self.instruction_path = Path(instruction_path) + self.obs_modality = "text" + self.lm_config = lm_config + instruction = json.load(open(self.instruction_path)) + instruction["examples"] = [tuple(e) for e in instruction["examples"]] + self.instruction: Instruction = instruction + self.tokenizer = tokenizer + + def get_lm_api_input( + self, intro: str, examples: list[tuple[str, str]], current: str + ) -> APIInput: + + """Return the require format for an API""" + message: list[dict[str, str]] | str + if "openai" in self.lm_config.provider: + if self.lm_config.mode == "chat": + message = [{"role": "system", "content": intro}] + for (x, y) in examples: + message.append( + { + "role": "system", + "name": "example_user", + "content": x, + } + ) + message.append( + { + "role": "system", + "name": "example_assistant", + "content": y, + } + ) + message.append({"role": "user", "content": current}) + return message + elif self.lm_config.mode == "completion": + message = f"{intro}\n\n" + message += "Here are a few examples:\n" + for example in examples: + message += f"Observation\n:{example[0]}\n\n" + message += f"Action: {example[1]}\n\n" + message += "Now make prediction given the observation\n\n" + message += f"Observation\n:{current}\n\n" + message += "Action:" + return message + else: + raise ValueError( + f"OpenAI models do not support mode {self.lm_config.mode}" + ) + elif "huggingface" in self.lm_config.provider: + # https://huggingface.co/blog/llama2#how-to-prompt-llama-2 + # https://github.com/facebookresearch/llama/blob/main/llama/generation.py#L320 + if "Llama-2" in self.lm_config.model: + if self.lm_config.mode == "chat": + B_INST, E_INST = "[INST]", "[/INST]" + B_SYS, E_SYS = "<>\n", "\n<>\n\n" + BOS, EOS = "", "" + # adding the system message to be the starting of the first example + examples = [ + ( + B_SYS + intro + E_SYS + examples[0][0], + examples[0][1], + ) + ] + examples[1:] + message = "".join( + [ + f"{BOS}{B_INST} {x.strip()} {E_INST} {y.strip()} {EOS}" + for (x, y) in examples + ] + ) + # add the current observation + message += f"{BOS}{B_INST} {current.strip()} {E_INST} {self.instruction['meta_data'].get('force_prefix', '')}" + + return message + else: + raise ValueError("Only chat mode is supported for Llama-2") + else: + raise ValueError( + f"Huggingface models do not support model_tag {self.lm_config.gen_config['model_tag']}" + ) + elif "ours" in self.lm_config.provider: + message = f"{intro}\n\n" + message += "Now make prediction given the observation\n\n" + message += f"Observation\n:{current}\n\n" + message += "Action:" + return message + else: + raise NotImplementedError( + f"Provider {self.lm_config.provider} not implemented" + ) + + def construct( + self, + trajectory: Trajectory, + intent: str, + meta_data: dict[str, Any] = {}, + ) -> APIInput: + raise NotImplementedError + + def map_url_to_real(self, url: str) -> str: + """Map the urls to their real world counterparts""" + for i, j in URL_MAPPINGS.items(): + if i in url: + url = url.replace(i, j) + return url + + def map_url_to_local(self, url: str) -> str: + """Map the urls to their local counterparts""" + for i, j in URL_MAPPINGS.items(): + if j in url: + url = url.replace(j, i) + # https + if j.replace("http", "https") in url: + url = url.replace(j.replace("http", "https"), i) + return url + + def _extract_action(self, response: str) -> str: + raise NotImplementedError + + def extract_action(self, response: str) -> str: + response = self._extract_action(response) + response = self.map_url_to_local(response) + return response + + +class DirectPromptConstructor(PromptConstructor): + """The agent will direct predict the action""" + + def __init__( + self, + instruction_path: str | Path, + lm_config: lm_config.LMConfig, + tokenizer: Tokenizer, + ): + super().__init__(instruction_path, lm_config, tokenizer) + + def construct( + self, + trajectory: Trajectory, + intent: str, + meta_data: dict[str, Any] = {}, + ) -> APIInput: + """Construct prompt given the trajectory""" + intro = self.instruction["intro"] + examples = self.instruction["examples"] + template = self.instruction["template"] + keywords = self.instruction["meta_data"]["keywords"] + state_info: StateInfo = trajectory[-1] # type: ignore[assignment] + + obs = state_info["observation"][self.obs_modality] + max_obs_length = self.lm_config.gen_config["max_obs_length"] + if max_obs_length: + obs = self.tokenizer.decode(self.tokenizer.encode(obs)[:max_obs_length]) # type: ignore[arg-type] + + page = state_info["info"]["page"] + url = page.url + previous_action_str = meta_data["action_history"][-1] + + # input x + current = template.format( + objective=intent, + url=self.map_url_to_real(url), + observation=obs, + previous_action=previous_action_str, + ) + + # make sure all keywords are replaced + assert all([f"{{k}}" not in current for k in keywords]) + prompt = self.get_lm_api_input(intro, examples, current) + return prompt + + def _extract_action(self, response: str) -> str: + action_splitter = self.instruction["meta_data"]["action_splitter"] + pattern = rf"{action_splitter}((.|\n)*?){action_splitter}" + match = re.search(pattern, response) + if match: + return match.group(1).strip() + else: + raise ActionParsingError( + f"Cannot parse action from response {response}" + ) + + +class CoTPromptConstructor(PromptConstructor): + """The agent will perform step-by-step reasoning before the answer""" + + def __init__( + self, + instruction_path: str | Path, + lm_config: lm_config.LMConfig, + tokenizer: Tokenizer, + ): + super().__init__(instruction_path, lm_config, tokenizer) + self.answer_phrase = self.instruction["meta_data"]["answer_phrase"] + + def construct( + self, + trajectory: Trajectory, + intent: str, + meta_data: dict[str, Any] = {}, + ) -> APIInput: + intro = self.instruction["intro"] + examples = self.instruction["examples"] + template = self.instruction["template"] + keywords = self.instruction["meta_data"]["keywords"] + state_info: StateInfo = trajectory[-1] # type: ignore[assignment] + + obs = state_info["observation"][self.obs_modality] + max_obs_length = self.lm_config.gen_config["max_obs_length"] + if max_obs_length: + obs = self.tokenizer.decode(self.tokenizer.encode(obs)[:max_obs_length]) # type: ignore[arg-type] + + page = state_info["info"]["page"] + url = page.url + previous_action_str = meta_data["action_history"][-1] + current = template.format( + objective=intent, + url=self.map_url_to_real(url), + observation=obs, + previous_action=previous_action_str, + ) + + assert all([f"{{k}}" not in current for k in keywords]) + + prompt = self.get_lm_api_input(intro, examples, current) + return prompt + + def _extract_action(self, response: str) -> str: + # find the first occurence of action + action_splitter = self.instruction["meta_data"]["action_splitter"] + pattern = rf"{action_splitter}((.|\n)*?){action_splitter}" + match = re.search(pattern, response) + if match: + return match.group(1).strip() + else: + raise ActionParsingError( + f'Cannot find the answer phrase "{self.answer_phrase}" in "{response}"' + ) + +class MyPromptConstructor(PromptConstructor): + """The agent will perform step-by-step reasoning before the answer""" + operation = [ + r"#?(Click)#?\s*([0-9]+)", + r"#?(Type)#?\s*([0-9]+)\s+[\'\"]{0,1}([\s\S]+)[\'\"]{0,1}", + r"#?(Select)#?\s*([0-9]+)\s+[\'\"]{0,1}(.+)[\'\"]{0,1}", + r"#?(Scroll_up)#?", + r"#?(Scroll_down)#?", + r"#?(Goto)#?\s*(https?:\/\/[-a-z0-9]+(?:\.[-a-z0-9]+)*\.(?:com|cn|edu|uk)(?:\/[-a-z0-9_:@&?=+,.!/~*'%$]*)?)", + r"#?(Go_backward)#?", + r"#?(Go_forward)#?", + r"#?(Hover)#?\s*([0-9]+)", + r"#?(Answer)#?\s+(.+)", + r"#?(Login)#?", + r"#?(Verify)#?", + r"#?(Exit)#?", + r"#?(Record)#?\s+[\'\"]{0,1}(.+)[\'\"]{0,1}", + ] + + translate = [ + "click", + "type", + "select", + "scroll [up]", + "scroll [down]", + "goto", + "go_back", + "go_forward", + "hover", + "stop", + "stop", + "stop", + "stop", + "record", + ] + + def __init__( + self, + instruction_path: str | Path, + lm_config: lm_config.LMConfig, + tokenizer: Tokenizer, + ): + super().__init__(instruction_path, lm_config, tokenizer) + self.answer_phrase = self.instruction["meta_data"]["answer_phrase"] + self.state = {} + + def construct( + self, + trajectory: Trajectory, + intent: str, + meta_data: dict[str, Any] = {}, + ) -> APIInput: + intro = self.instruction["intro"] + examples = self.instruction["examples"] + template = self.instruction["template"] + keywords = self.instruction["meta_data"]["keywords"] + finale = self.instruction["finale"] + state_info: StateInfo = trajectory[-1] # type: ignore[assignment] + + obs = state_info["observation"][self.obs_modality] + max_obs_length = self.lm_config.gen_config["max_obs_length"] + if max_obs_length: + obs = self.tokenizer.decode(self.tokenizer.encode(obs)[:max_obs_length]) # type: ignore[arg-type] + + info = state_info["info"] + obs_metadata = info["observation_metadata"]["text"] + nodes = obs_metadata["obs_nodes_info"] + position_info = obs_metadata["position_info"] + html_parser = obs_metadata["html_parser"] + self.nodes = nodes + + page = info["page"] + url = self.map_url_to_real(page.url) + position_bar = self._get_position_bar(position_info) + + history = [f"{ix}. {his}" for his in meta_data["action_history"]] + if len(history) == 1: + previous_action_str = "None" + else: + previous_action_str = '\n'.join(history[1:]) + + self.state.update({ + "url": url, + "html": obs, + "html_parser": html_parser, + "segment": "None", + "operation": "None", + }) + + current = template.format( + objective=intent, + url=url, + html=obs, + position=position_bar, + previous_action=previous_action_str, + ) + + assert all([f"{{k}}" not in current for k in keywords]) + + # prompt = self.get_lm_api_input(intro, examples, current) + prompt = current + finale + + return prompt + + def _extract_action(self, response: str) -> str: + # find the first occurence of action + self.state["intention"] = self._extract_intention(response) + + for regex, act in zip(self.operation, self.translate): + match = re.search(regex, response) + + if match: + m = match.groups() + if isinstance(m, tuple): + exact_act = m[0] + param = m[1:] + else: + exact_act = m + param = [] + + param = list(param) + if act in ['click', 'hover', 'type', 'select']: + if len(param) == 0: + continue + + for node_id, node in self.nodes.items(): + if node['label'] == param[0]: + label = param[0] + hp = self.state["html_parser"] + bid = hp.id_label_converter(label) + segment = hp.get_segment(bid) + + print('[Label]', label, bid, segment) + self.state["segment"] = segment + #self._extract_segment(self.state["html"], label) + if act not in ['select']: + param[0] = node_id + break + + + if act in ['stop', 'select', 'record']: + if len(param) > 0: + param[-1] = param[-1].strip("\'\"") + + if act in ['type']: + print('In prompt constructer', param[-1]) + if len(param) > 0: + param[-1] = param[-1].strip("\'\"") + print(param[-1]) + if param[-1].endswith('\n'): + param[-1] = param[-1][:-1] + param.append('1') + else: + param.append('0') + + command = act + for p in param: + command += f" [{p}]" + + print(command) + return command + + raise ActionParsingError( + f'Cannot find the answer phrase in "{response}"' + ) + + @staticmethod + def _get_position_bar(data): + position = data.get("position", 0.0) + page_height = data.get("page_height", 1.0) + left_bar = '-' * int(position) + right_bar = '-' * int(max(1, page_height - position)) + return f'[0{left_bar}|{round(position, 1)}{right_bar}{round(page_height, 1)}]' + + @staticmethod + def _extract_intention(response, lang='en'): + if lang == 'en': + matches = re.findall(r"#Thinking Process:\s*(.+)\s*#Operation:", response) + print('[Try to match]', matches) + else: + matches = re.findall(r"#思考过程: (.+)", response) + + if matches: + return matches[-1] + else: + return None + + @staticmethod + def _extract_segment(html: str, tag: str): + tag = f'[{tag}]' + has_content = False + + def _left(html, start): + nonlocal has_content + left_cnt, right_cnt = 0, 0 + for i in range(start, -1, -1): + if html[i] == '<': + left_cnt += 1 + elif html[i] == '>': + if html[i - 2] != '|' and html[i - 2] != '>': + has_content = True + right_cnt += 1 + elif html[i] == '|': + if html[i + 2] != '<' and html[i + 2] != '>': + has_content = True + if left_cnt == right_cnt + 1: + return i + return -1 + + def _right(html, start): + nonlocal has_content + left_cnt, right_cnt = 0, 0 + for i in range(start, len(html), 1): + if html[i] == '<': + left_cnt += 1 + elif html[i] == '>': + if html[i - 2] != '|' and html[i - 2] != '>': + has_content = True + right_cnt += 1 + elif html[i] == '|': + if html[i + 2] != '<' and html[i + 2] != '>': + has_content = True + if left_cnt + 1 == right_cnt: + return i + 1 + return -1 + + tag_start = html.find(tag) + + if tag_start == -1: + return None + + left_bound, right_bound = _left(html, tag_start), _right(html, tag_start) + while True: + if left_bound == -1 or right_bound == -1: + return None + + if has_content: + break + + else: + lb, rb = _left(html, left_bound - 1), _right(html, right_bound + 1) + if lb == -1 or rb == -1: + break + if rb - lb > 150: + break + else: + left_bound, right_bound = lb, rb + + segment = html[left_bound:right_bound] + + if len(segment) > 150: + return segment[:150] + '...>' + + return segment + +class NewASPromptConstructor(PromptConstructor): + """The agent will perform step-by-step reasoning before the answer""" + operation = [ + r"(click)\(\s*[\'\"]([A-Z]{1,3})[\'\"]\s*\)", + r"(type_string)\(\s*[\'\"]([A-Z]{1,3})[\'\"]\s*,\s*[\'\"]([\s\S]+)[\'\"]\s*,\s*(True|False)\s*\)", + r"(select)\(\s*[\'\"]([A-Z]{1,3})[\'\"]\s*,\s*[\'\"]([\s\S]+)[\'\"]\s*\)", + r"(scroll_page)\(\s*[\'\"]up[\'\"]\s*\)", + r"(scroll_page)\(\s*[\'\"]down[\'\"]\s*\)", + r"(jump_to)\(\s*[\'\"](.+)[\'\"]\s*,\s*(True|False)\s*\)", + r"(go)\(\s*[\'\"]backward[\'\"]\s*\)", + r"(go)\(\s*[\'\"]forward[\'\"]\s*\)", + r"(hover)\(\s*[\'\"]([A-Z]{1,3})[\'\"]\s*\)", + r"(finish)\(\s*\)", + r"(finish)\(\s*(.+)\s*\)", + r"(record)\(\s*[\'\"](.+)[\'\"]\s*\)", + r"(switch_tab)\([\d]+\)" + ] + + translate = [ + "click", + "type", + "select", + "scroll [up]", + "scroll [down]", + "goto", + "go_back", + "go_forward", + "hover", + "stop", + "stop", + "record", + "page_focus", + ] + + def __init__( + self, + instruction_path: str | Path, + lm_config: lm_config.LMConfig, + tokenizer: Tokenizer, + ): + super().__init__(instruction_path, lm_config, tokenizer) + self.answer_phrase = self.instruction["meta_data"]["answer_phrase"] + self.state = {} + + def construct( + self, + trajectory: Trajectory, + intent: str, + meta_data: dict[str, Any] = {}, + ) -> APIInput: + intro = self.instruction["intro"] + examples = self.instruction["examples"] + template = self.instruction["template"] + keywords = self.instruction["meta_data"]["keywords"] + finale = self.instruction["finale"] + state_info: StateInfo = trajectory[-1] # type: ignore[assignment] + + obs = state_info["observation"][self.obs_modality] + max_obs_length = self.lm_config.gen_config["max_obs_length"] + if max_obs_length: + obs = self.tokenizer.decode(self.tokenizer.encode(obs)[:max_obs_length]) # type: ignore[arg-type] + + info = state_info["info"] + obs_metadata = info["observation_metadata"]["text"] + nodes = obs_metadata["obs_nodes_info"] + position_info = obs_metadata["position_info"] + html_parser = obs_metadata["html_parser"] + tabs_str = obs_metadata["tab_title"] + self.nodes = nodes + + page = info["page"] + url = self.map_url_to_real(page.url) + position_bar = self._get_position_bar(position_info) + + history = meta_data["action_history"] + if len(history) == 1: + previous_action_str = "None" + else: + previous_action_str = '\n'.join(history[1:]) + + self.state.update({ + "url": url, + "html": obs, + "html_parser": html_parser, + "segment": "None", + "operation": "None", + }) + + current = template.format( + objective=intent, + url=url, + html=obs, + position=position_bar, + previous_action=previous_action_str, + tabs=tabs_str, + ) + + assert all([f"{{k}}" not in current for k in keywords]) + + # prompt = self.get_lm_api_input(intro, examples, current) + prompt = current + finale + + return prompt + + def _extract_action(self, response: str) -> str: + # find the first occurence of action + # self.state["intention"] = self._extract_intention(response) + + for regex, act in zip(self.operation, self.translate): + match = re.search(regex, response) + if match: + m = match.groups() + if isinstance(m, tuple): + exact_act = m[0] + param = m[1:] + else: + exact_act = m + param = [] + + print(exact_act, param) + param = list(param) + if act in ['click', 'hover', 'type', 'select']: + if len(param) == 0: + continue + + for node_id, node in self.nodes.items(): + if node['label'] == param[0]: + label = param[0] + hp = self.state["html_parser"] + bid = hp.id_label_converter(label) + segment = hp.get_segment(bid) + + print('[Label]', label, bid, segment) + self.state["segment"] = segment + #self._extract_segment(self.state["html"], label) + if act not in ['select']: + param[0] = node_id + break + + if len(param) > 0: + if act in ['stop', 'select', 'record']: + param[-1] = param[-1].strip("\'\"") + if act in ['type', 'goto']: + param[-1] = '1' if param[-1] == 'True' else '0' + + command = act + for p in param: + command += f" [{p}]" + + print(command) + return command + + raise ActionParsingError( + f'Cannot find the answer phrase in "{response}"' + ) + + @staticmethod + def _get_position_bar(data): + position = data.get("position", 0.0) + page_height = data.get("page_height", 1.0) + return f"{round(position, 1)} / {round(page_height, 1)}" \ No newline at end of file diff --git a/webarena/agent/prompts/raw/new_action_prompt.py b/webarena/agent/prompts/raw/new_action_prompt.py new file mode 100644 index 0000000..5382b03 --- /dev/null +++ b/webarena/agent/prompts/raw/new_action_prompt.py @@ -0,0 +1,118 @@ +prompt = { + "intro": "", + "examples": [], + "template": """ {html} + +You are a helpful assistant that can assist with web navigation tasks. +You are given a simplified html webpage and a task description. +Your goal is to complete the task. You can use the provided functions below to interact with the current webpage. + +#Provided functions: +def click(element_id: str) -> None: + \"\"\" + Click on the element with the specified id. + + Args: + element_id: The id of the element. + \"\"\" + +def hover(element_id: str) -> None: + \"\"\" + Hover on the element with the specified id. + + Args: + element_id: The id of the element. + \"\"\" + +def select(element_id: str, option: str) -> None: + \"\"\" + Select an option from a dropdown. + + Args: + element_id: The id of the element. + option: Value of the option to select. + \"\"\" + +def type_string(element_id: str, content: str, press_enter: bool) -> None: + \"\"\" + Type a string into the element with the specified id. + + Args: + element_id: The id of the element. + content: The string to type. + press_enter: Whether to press enter after typing the string. + \"\"\" + +def scroll_page(direction: Literal['up', 'down']) -> None: + \"\"\" + Scroll down/up one page. + + Args: + direction: The direction to scroll. + \"\"\" + +def go(direction: Literal['forward', 'backward']) -> None: + \"\"\" + Go forward/backward + + Args: + direction: The direction to go to. + \"\"\" + +def jump_to(url: str, new_tab: bool) -> None: + \"\"\" + Jump to the specified url. + + Args: + url: The url to jump to. + new_tab: Whether to open the url in a new tab. + \"\"\" + +def switch_tab(tab_index: int) -> None: + \"\"\" + Switch to the specified tab. + + Args: + tab_index: The index of the tab to switch to. + \"\"\" + +def user_input(message: str) -> str: + \"\"\" + Wait for user input. + + Args: + message: The message to display to the user. + + Returns: The user input. + \"\"\" + +def finish(answer: Optional[str]) -> None: + \"\"\" + Finish the task (optionally with an answer). + + Args: + answer: The answer to the task. + \"\"\" + +#Previous commands: {previous_action} + +#Window tabs: {tabs} + +#Current viewport (pages): {position} + +#Task: {objective} + +You should output one command to interact to the currrent webpage. +You should add a brief comment to your command to explain your reasoning and thinking process. +""", + "finale": "", + "meta_data": { + "observation": "html", + "action_type": "id_html_nasc_tree", + "keywords": ["url", "html", "objective", "position", "previous_action", "tabs"], + "prompt_constructor": "NewASPromptConstructor", + "answer_phrase": "", + "action_splitter": "#" + }, +} + diff --git a/webarena/agent/prompts/raw/p_cot_id_actree_2s.py b/webarena/agent/prompts/raw/p_cot_id_actree_2s.py new file mode 100644 index 0000000..b85e54c --- /dev/null +++ b/webarena/agent/prompts/raw/p_cot_id_actree_2s.py @@ -0,0 +1,82 @@ +prompt = { + "intro": """You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue. + +Here's the information you'll have: +The user's objective: This is the task you're trying to complete. +The current web page's accessibility tree: This is a simplified representation of the webpage, providing key information. +The current web page's URL: This is the page you're currently navigating. +The open tabs: These are the tabs you have open. +The previous action: This is the action you just performed. It may be helpful to track your progress. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. +`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v). +`scroll [direction=down|up]`: Scroll the page up or down. + +Tab Management Actions: +`new_tab`: Open a new, empty browser tab. +`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index. +`close_tab`: Close the currently active tab. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Homepage: +If you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit. +http://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites. + +To be successful, it is very important to follow the following rules: +1. You should only issue an action that is valid given the current observation +2. You should only issue one action at a time. +3. You should follow the examples to reason step by step and then issue the next action. +4. Generate the action in the correct format. Start with a "In summary, the next action I will perform is" phrase, followed by action inside ``````. For example, "In summary, the next action I will perform is ```click [1234]```". +5. Issue stop action when you think you have achieved the objective. Don't generate anything after stop.""", + "examples": [ + ( + """OBSERVATION: +[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)' + [1749] StaticText '$279.49' + [1757] button 'Add to Cart' + [1760] button 'Add to Wish List' + [1761] button 'Add to Compare' +URL: http://onestopmarket.com/office-products/office-electronics.html +OBJECTIVE: What is the price of HP Inkjet Fax Machine +PREVIOUS ACTION: None""", + "Let's think step-by-step. This page list the information of HP Inkjet Fax Machine, which is the product identified in the objective. Its price is $279.49. I think I have achieved the objective. I will issue the stop action with the answer. In summary, the next action I will perform is ```stop [$279.49]```", + ), + ( + """OBSERVATION: +[164] textbox 'Search' focused: True required: False +[171] button 'Go' +[174] link 'Find directions between two points' +[212] heading 'Search Results' +[216] button 'Close' +URL: http://openstreetmap.org +OBJECTIVE: Show me the restaurants near CMU +PREVIOUS ACTION: None""", + "Let's think step-by-step. This page has a search box whose ID is [164]. According to the nominatim rule of openstreetmap, I can search for the restaurants near a location by \"restaurants near\". I can submit my typing by pressing the Enter afterwards. In summary, the next action I will perform is ```type [164] [restaurants near CMU] [1]```", + ), + ], + "template": """OBSERVATION: +{observation} +URL: {url} +OBJECTIVE: {objective} +PREVIOUS ACTION: {previous_action}""", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": ["url", "objective", "observation", "previous_action"], + "prompt_constructor": "CoTPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```" + }, +} diff --git a/webarena/agent/prompts/raw/p_cot_id_actree_2s_no_na.py b/webarena/agent/prompts/raw/p_cot_id_actree_2s_no_na.py new file mode 100644 index 0000000..945cd95 --- /dev/null +++ b/webarena/agent/prompts/raw/p_cot_id_actree_2s_no_na.py @@ -0,0 +1,82 @@ +prompt = { + "intro": """You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue. + +Here's the information you'll have: +The user's objective: This is the task you're trying to complete. +The current web page's accessibility tree: This is a simplified representation of the webpage, providing key information. +The current web page's URL: This is the page you're currently navigating. +The open tabs: These are the tabs you have open. +The previous action: This is the action you just performed. It may be helpful to track your progress. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. +`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v). +`scroll [direction=down|up]`: Scroll the page up or down. + +Tab Management Actions: +`new_tab`: Open a new, empty browser tab. +`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index. +`close_tab`: Close the currently active tab. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. + +Homepage: +If you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit. +http://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites. + +To be successful, it is very important to follow the following rules: +1. You should only issue an action that is valid given the current observation +2. You should only issue one action at a time. +3. You should follow the examples to reason step by step and then issue the next action. +4. Generate the action in the correct format. Start with a "In summary, the next action I will perform is" phrase, followed by action inside ``````. For example, "In summary, the next action I will perform is ```click [1234]```". +5. Issue stop action when you think you have achieved the objective. Don't generate anything after stop.""", + "examples": [ + ( + """OBSERVATION: +[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)' + [1749] StaticText '$279.49' + [1757] button 'Add to Cart' + [1760] button 'Add to Wish List' + [1761] button 'Add to Compare' +URL: http://onestopmarket.com/office-products/office-electronics.html +OBJECTIVE: What is the price of HP Inkjet Fax Machine +PREVIOUS ACTION: None""", + "Let's think step-by-step. This page list the information of HP Inkjet Fax Machine, which is the product identified in the objective. Its price is $279.49. I think I have achieved the objective. I will issue the stop action with the answer. In summary, the next action I will perform is ```stop [$279.49]```", + ), + ( + """OBSERVATION: +[164] textbox 'Search' focused: True required: False +[171] button 'Go' +[174] link 'Find directions between two points' +[212] heading 'Search Results' +[216] button 'Close' +URL: http://openstreetmap.org +OBJECTIVE: Show me the restaurants near CMU +PREVIOUS ACTION: None""", + "Let's think step-by-step. This page has a search box whose ID is [164]. According to the nominatim rule of openstreetmap, I can search for the restaurants near a location by \"restaurants near\". I can submit my typing by pressing the Enter afterwards. In summary, the next action I will perform is ```type [164] [restaurants near CMU] [1]```", + ), + ], + "template": """OBSERVATION: +{observation} +URL: {url} +OBJECTIVE: {objective} +PREVIOUS ACTION: {previous_action}""", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": ["url", "objective", "observation", "previous_action"], + "prompt_constructor": "CoTPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```" + }, +} diff --git a/webarena/agent/prompts/raw/p_direct_id_actree_2s.py b/webarena/agent/prompts/raw/p_direct_id_actree_2s.py new file mode 100644 index 0000000..8d4e4f6 --- /dev/null +++ b/webarena/agent/prompts/raw/p_direct_id_actree_2s.py @@ -0,0 +1,80 @@ +prompt = { + "intro": """You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue. + +Here's the information you'll have: +The user's objective: This is the task you're trying to complete. +The current web page's accessibility tree: This is a simplified representation of the webpage, providing key information. +The current web page's URL: This is the page you're currently navigating. +The open tabs: These are the tabs you have open. +The previous action: This is the action you just performed. It may be helpful to track your progress. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. +`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v). +`scroll [direction=down|up]`: Scroll the page up or down. + +Tab Management Actions: +`new_tab`: Open a new, empty browser tab. +`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index. +`close_tab`: Close the currently active tab. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. If you believe the task is impossible to complete, provide the answer as "N/A" in the bracket. + +Homepage: +If you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit. +http://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites. + +To be successful, it is very important to follow the following rules: +1. You should only issue an action that is valid given the current observation +2. You should only issue one action at a time. +3. Generate the action in the correct format. Always put the action inside a pair of ```. For example, ```click [1234]```. +5. Issue stop action when you think you have achieved the objective. Don't generate anything after stop.""", + "examples": [ + ( + """OBSERVATION: +[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)' + [1749] StaticText '$279.49' + [1757] button 'Add to Cart' + [1760] button 'Add to Wish List' + [1761] button 'Add to Compare' +URL: http://onestopmarket.com/office-products/office-electronics.html +OBJECTIVE: What is the price of HP Inkjet Fax Machine +PREVIOUS ACTION: None""", + "```stop [$279.49]```", + ), + ( + """OBSERVATION: +[164] textbox 'Search' focused: True required: False +[171] button 'Go' +[174] link 'Find directions between two points' +[212] heading 'Search Results' +[216] button 'Close' +URL: http://openstreetmap.org +OBJECTIVE: Show me the restaurants near CMU +PREVIOUS ACTION: None""", + "```type [164] [restaurants near CMU] [1]```", + ), + ], + "template": """OBSERVATION: +{observation} +URL: {url} +OBJECTIVE: {objective} +PREVIOUS ACTION: {previous_action}""", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": ["url", "objective", "observation", "previous_action"], + "prompt_constructor": "DirectPromptConstructor", + "action_splitter": "```" + }, +} diff --git a/webarena/agent/prompts/raw/p_direct_id_actree_2s_no_na.py b/webarena/agent/prompts/raw/p_direct_id_actree_2s_no_na.py new file mode 100644 index 0000000..c399454 --- /dev/null +++ b/webarena/agent/prompts/raw/p_direct_id_actree_2s_no_na.py @@ -0,0 +1,81 @@ +prompt = { + "intro": """You are an autonomous intelligent agent tasked with navigating a web browser. You will be given web-based tasks. These tasks will be accomplished through the use of specific actions you can issue. + +Here's the information you'll have: +The user's objective: This is the task you're trying to complete. +The current web page's accessibility tree: This is a simplified representation of the webpage, providing key information. +The current web page's URL: This is the page you're currently navigating. +The open tabs: These are the tabs you have open. +The previous action: This is the action you just performed. It may be helpful to track your progress. + +The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. +`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v). +`scroll [direction=down|up]`: Scroll the page up or down. + +Tab Management Actions: +`new_tab`: Open a new, empty browser tab. +`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index. +`close_tab`: Close the currently active tab. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. + +Homepage: +If you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit. +http://homepage.com/password.html lists all the account name and password for the websites. You can use them to log in to the websites. + +To be successful, it is very important to follow the following rules: +1. You should only issue an action that is valid given the current observation +2. You should only issue one action at a time. +4. Generate the action in the correct format, wrap the action inside ``````. For example, ```click [1234]```". +5. Issue stop action when you think you have achieved the objective.""", + "examples": [ + ( + """OBSERVATION: +[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)' + [1749] StaticText '$279.49' + [1757] button 'Add to Cart' + [1760] button 'Add to Wish List' + [1761] button 'Add to Compare' +URL: http://onestopmarket.com/office-products/office-electronics.html +OBJECTIVE: What is the price of HP Inkjet Fax Machine +PREVIOUS ACTION: None""", + "```stop [$279.49]```", + ), + ( + """OBSERVATION: +[164] textbox 'Search' focused: True required: False +[171] button 'Go' +[174] link 'Find directions between two points' +[212] heading 'Search Results' +[216] button 'Close' +URL: http://openstreetmap.org +OBJECTIVE: Show me the restaurants near CMU +PREVIOUS ACTION: None""", + "```type [164] [restaurants near CMU] [1]```", + ), + ], + "template": """OBSERVATION: +{observation} +URL: {url} +OBJECTIVE: {objective} +PREVIOUS ACTION: {previous_action}""", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": ["url", "objective", "observation", "previous_action"], + "prompt_constructor": "CoTPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```" + }, +} diff --git a/webarena/agent/prompts/raw/p_direct_id_actree_3s_llama.py b/webarena/agent/prompts/raw/p_direct_id_actree_3s_llama.py new file mode 100644 index 0000000..6278d2b --- /dev/null +++ b/webarena/agent/prompts/raw/p_direct_id_actree_3s_llama.py @@ -0,0 +1,83 @@ +prompt = { + "intro": """You are an autonomous intelligent agent tasked with navigating a web browser. The actions you can perform fall into several categories: + +Page Operation Actions: +`click [id]`: This action clicks on an element with a specific id on the webpage. +`type [id] [content] [press_enter_after=0|1]`: Use this to type the content into the field with id. By default, the "Enter" key is pressed after typing unless press_enter_after is set to 0. +`hover [id]`: Hover over an element with id. +`press [key_comb]`: Simulates the pressing of a key combination on the keyboard (e.g., Ctrl+v). +`scroll [direction=down|up]`: Scroll the page up or down. + +Tab Management Actions: +`new_tab`: Open a new, empty browser tab. +`tab_focus [tab_index]`: Switch the browser's focus to a specific tab using its index. +`close_tab`: Close the currently active tab. + +URL Navigation Actions: +`goto [url]`: Navigate to a specific URL. +`go_back`: Navigate to the previously viewed page. +`go_forward`: Navigate to the next page (if a previous 'go_back' action was performed). + +Completion Action: +`stop [answer]`: Issue this action when you believe the task is complete. If the objective is to find a text-based answer, provide the answer in the bracket. + +Homepage: +If you want to visit other websites, check out the homepage at http://homepage.com. It has a list of websites you can visit. + +You can only issue one action at a time""", + + "examples": [ + ( + """Observation: +[1744] link 'HP CB782A#ABA 640 Inkjet Fax Machine (Renewed)' + [1749] StaticText '$279.49' + [1757] button 'Add to Cart' + [1760] button 'Add to Wish List' + [1761] button 'Add to Compare' +URL: http://onestopmarket.com/office-products/office-electronics.html +Objective: What is the price of HP Inkjet Fax Machine +Previous action: None""", + "```stop [$279.49]```", + ), + ( + """Observation: +[164] textbox 'Search' focused: True required: False +[171] button 'Go' +[174] link 'Find directions between two points' +[212] heading 'Search Results' +[216] button 'Close' +URL: http://openstreetmap.org +Objective: Show me the restaurants near CMU +Previous action: None""", + "```type [164] [restaurants near CMU] [1]```", + ), + ( + """Observation: +[2036] button 'Sort by: New' hasPopup: menu expanded: False + [587] link 'US Marine’s adoption of Afghan war orphan voided' + [989] time 'March 30, 2023 at 15:03:48 AM UTC' + [602] link 'York student uses AI chatbot to get parking fine revoked' + [1025] time 'March 15, 2023 at 7:48:34 AM UTC' + [617] link 'Loveland parents furious after teachers leave, communication lagged during school threat investigation' + [1025] time 'March 2, 2023 at 3:46:01 AM UTC' +URL: http://reddit.com/f/news/new +Objective: Open the most recent post that was published prior to March 1st. +Previous action: None""", + "```scroll [down]```", + ) + ], + "template": """Observation: +{observation} +URL: {url} +Objective: {objective} +Previous action: {previous_action}""", + "meta_data": { + "observation": "accessibility_tree", + "action_type": "id_accessibility_tree", + "keywords": ["url", "objective", "observation", "previous_action"], + "prompt_constructor": "DirectPromptConstructor", + "answer_phrase": "In summary, the next action I will perform is", + "action_splitter": "```", + "force_prefix": "```" + }, +} diff --git a/webarena/agent/prompts/raw/test_prompt.py b/webarena/agent/prompts/raw/test_prompt.py new file mode 100644 index 0000000..5979e58 --- /dev/null +++ b/webarena/agent/prompts/raw/test_prompt.py @@ -0,0 +1,41 @@ +prompt = { + "intro": "", + "examples": [], + "template": """ {html} + +You are a helpful assistant that can assist with web navigation tasks. +You are given a simplified html webpage and a task description. +Your goal is to complete the task. You can perform the specified operations below to interact with the webpage. + +#Valid operations: - #Click# id: Click on the element with the specified id +- #Scroll_up#: Scroll up 1 page. +- #Scroll_down#: Scroll down 1 page. +- #Go_backward#: Go back to the previous page. +- #Go_forward#: Go forward to the next page. +- #Hover# id: Hover over the element with the specified id. +- #Type# id "text": Type in the text at the element with the specified id. +- #Select# id "option": Select the option at the element with the specified id. +- #Record# "content": Mark content that is useful in answering the question. +- #Answer# "text": output the text as the answer to the user. +- #Exit#: Complete the task and exit the program. + +#Current viewport position: {position} + +#Previous Operation: {previous_action} + +#Task: {objective} +""", + "finale": """ +Your output SHOULD be in the following format: +#Operation: {Next operation to perform} +""", + "meta_data": { + "observation": "html", + "action_type": "id_html_tree", + "keywords": ["url", "html", "objective", "position", "previous_action"], + "prompt_constructor": "MyPromptConstructor", + "answer_phrase": "", + "action_splitter": "#" + }, +} + diff --git a/webarena/agent/prompts/to_json.py b/webarena/agent/prompts/to_json.py new file mode 100644 index 0000000..efb283c --- /dev/null +++ b/webarena/agent/prompts/to_json.py @@ -0,0 +1,26 @@ +import glob +import importlib +import json +import os + + +# use the current directory as the root +def run() -> None: + """Convert all python files in agent/prompts to json files in agent/prompts/jsons + + Python files are easiser to edit + """ + for p_file in glob.glob(f"agent/prompts/raw/*.py"): + # import the file as a module + base_name = os.path.basename(p_file).replace(".py", "") + module = importlib.import_module(f"agent.prompts.raw.{base_name}") + prompt = module.prompt + # save the prompt as a json file + os.makedirs("agent/prompts/jsons", exist_ok=True) + with open(f"agent/prompts/jsons/{base_name}.json", "w+") as f: + json.dump(prompt, f, indent=2) + print(f"Done convert python files to json") + + +if __name__ == "__main__": + run() diff --git a/webarena_replication.py b/webarena_replication.py new file mode 100644 index 0000000..8c4a542 --- /dev/null +++ b/webarena_replication.py @@ -0,0 +1,464 @@ +"""Script to run end-to-end evaluation on the benchmark""" +import argparse +import glob +import json +import logging +import os +import random +import subprocess +import tempfile +import time +from pathlib import Path + +import openai + +from webarena.agent import ( + Agent, + PromptAgent, + TeacherForcingAgent, + construct_agent, +) +from webarena.agent.prompts import * +from browser_env import ( + Action, + ActionTypes, + ScriptBrowserEnv, + StateInfo, + Trajectory, + create_stop_action, +) +from browser_env.actions import is_equivalent +from browser_env.auto_login import get_site_comb_from_filepath +from browser_env.helper_functions import ( + RenderHelper, + get_action_description, +) +from evaluation_harness import evaluator_router +from tqdm import tqdm +import nltk +nltk.download('punkt_tab') + +LOG_FOLDER = "log_files" +Path(LOG_FOLDER).mkdir(parents=True, exist_ok=True) +LOG_FILE_NAME = f"{LOG_FOLDER}/log_{time.strftime('%Y%m%d%H%M%S', time.localtime())}_{random.randint(0, 10000)}.log" + +logger = logging.getLogger("logger") +logger.setLevel(logging.INFO) + +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.DEBUG) +logger.addHandler(console_handler) + +file_handler = logging.FileHandler(LOG_FILE_NAME) +file_handler.setLevel(logging.DEBUG) +logger.addHandler(file_handler) + +# Set the log format +formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") +console_handler.setFormatter(formatter) +file_handler.setFormatter(formatter) + + +def config() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Run end-to-end evaluation on the benchmark" + ) + parser.add_argument( + "--render", action="store_true", help="Render the browser" + ) + parser.add_argument( + "--slow_mo", + type=int, + default=0, + help="Slow down the browser by the specified amount", + ) + parser.add_argument( + "--action_set_tag", default="id_accessibility_tree", help="Action type" + ) + parser.add_argument( + "--observation_type", + choices=["accessibility_tree", "html", "image"], + default="accessibility_tree", + help="Observation type", + ) + parser.add_argument( + "--current_viewport_only", + action="store_true", + help="Only use the current viewport for the observation", + ) + parser.add_argument("--viewport_width", type=int, default=1280) + parser.add_argument("--viewport_height", type=int, default=720) + parser.add_argument("--save_trace_enabled", action="store_true") + parser.add_argument("--sleep_after_execution", type=float, default=0.0) + + parser.add_argument("--max_steps", type=int, default=30) + + # agent config + parser.add_argument("--agent_type", type=str, default="prompt") + parser.add_argument( + "--instruction_path", + type=str, + default="agents/prompts/state_action_agent.json", + ) + parser.add_argument( + "--parsing_failure_th", + help="When concesecutive parsing failure exceeds this threshold, the agent will stop", + type=int, + default=3, + ) + parser.add_argument( + "--repeating_action_failure_th", + help="When concesecutive repeating action exceeds this threshold, the agent will stop", + type=int, + default=3, + ) + + # lm config + parser.add_argument("--provider", type=str, default="openai") + parser.add_argument("--model", type=str, default="gpt-3.5-turbo-0613") + parser.add_argument("--mode", type=str, default="chat") + parser.add_argument("--temperature", type=float, default=1.0) + parser.add_argument("--top_p", type=float, default=0.9) + parser.add_argument("--context_length", type=int, default=0) + parser.add_argument("--max_tokens", type=int, default=384) + parser.add_argument("--stop_token", type=str, default=None) + parser.add_argument("--cuda", type=str, default='0') + parser.add_argument( + "--max_retry", + type=int, + help="max retry times to perform generations when parsing fails", + default=1, + ) + parser.add_argument( + "--max_obs_length", + type=int, + help="when not zero, will truncate the observation to this length before feeding to the model", + default=1920, + ) + parser.add_argument( + "--model_endpoint", + help="huggingface model endpoint", + type=str, + default="", + ) + + # example config + parser.add_argument("--test_start_idx", type=int, default=0) + parser.add_argument("--test_end_idx", type=int, default=1000) + parser.add_argument("--sample", type=int, default=1) + + # logging related + parser.add_argument("--result_dir", type=str, default="") + args = parser.parse_args() + + # check the whether the action space is compatible with the observation space + if ( + args.action_set_tag == "id_accessibility_tree" + and args.observation_type not in ["accessibility_tree", "html"] + ): + raise ValueError( + f"Action type {args.action_set_tag} is incompatible with the observation type {args.observation_type}" + ) + + return args + + +def early_stop( + trajectory: Trajectory, max_steps: int, thresholds: dict[str, int] +) -> tuple[bool, str]: + """Check whether need to early stop""" + + # reach the max step + num_steps = (len(trajectory) - 1) / 2 + if num_steps >= max_steps: + return True, f"Reach max steps {max_steps}" + + last_k_actions: list[Action] + action_seq: list[Action] + + # Case: parsing failure for k times + k = thresholds["parsing_failure"] + last_k_actions = trajectory[1::2][-k:] # type: ignore[assignment] + if len(last_k_actions) >= k: + if all( + [ + action["action_type"] == ActionTypes.NONE + for action in last_k_actions + ] + ): + return True, f"Failed to parse actions for {k} times" + + # Case: same action for k times + k = thresholds["repeating_action"] + last_k_actions = trajectory[1::2][-k:] # type: ignore[assignment] + action_seq = trajectory[1::2] # type: ignore[assignment] + + if len(action_seq) == 0: + return False, "" + + last_action: Action = action_seq[-1] + + if last_action["action_type"] != ActionTypes.TYPE: + if len(last_k_actions) >= k: + if all( + [ + is_equivalent(action, last_action) + for action in last_k_actions + ] + ): + return True, f"Same action for {k} times" + + else: + # check the action sequence + if ( + sum([is_equivalent(action, last_action) for action in action_seq]) + >= k + ): + return True, f"Same typing action for {k} times" + + return False, "" + + +def test( + args: argparse.Namespace, + agent: Agent | PromptAgent | TeacherForcingAgent, + config_file_list: list[str], +) -> None: + scores = [] + max_steps = args.max_steps + + early_stop_thresholds = { + "parsing_failure": args.parsing_failure_th, + "repeating_action": args.repeating_action_failure_th, + } + + env = ScriptBrowserEnv( + headless=not args.render, + slow_mo=args.slow_mo, + observation_type=args.observation_type, + current_viewport_only=args.current_viewport_only, + viewport_size={ + "width": args.viewport_width, + "height": args.viewport_height, + }, + save_trace_enabled=args.save_trace_enabled, + sleep_after_execution=args.sleep_after_execution, + ) + + for config_file in tqdm(config_file_list): + try: + render_helper = RenderHelper( + config_file, args.result_dir, args.action_set_tag + ) + + # get intent + with open(config_file) as f: + _c = json.load(f) + intent = _c["intent"] + task_id = _c["task_id"] + if task_id in list(range(600, 650))+list(range(681, 689)): + # continue + print("Reddit post task. Sleep 30 mins.") + time.sleep(1800) + # automatically login + if _c["storage_state"]: + cookie_file_name = os.path.basename(_c["storage_state"]) + comb = get_site_comb_from_filepath(cookie_file_name) + temp_dir = tempfile.mkdtemp() + # subprocess to renew the cookie + subprocess.run( + [ + "python", + "browser_env/auto_login.py", + "--auth_folder", + temp_dir, + "--site_list", + *comb, + ] + ) + _c["storage_state"] = f"{temp_dir}/{cookie_file_name}" + assert os.path.exists(_c["storage_state"]) + # update the config file + config_file = f"{temp_dir}/{os.path.basename(config_file)}" + with open(config_file, "w") as f: + json.dump(_c, f) + + logger.info(f"[Config file]: {config_file}") + logger.info(f"[Intent]: {intent}") + + agent.reset(config_file) + trajectory: Trajectory = [] + obs, info = env.reset(options={"config_file": config_file}) + obs["text"] = obs["text"][0] + state_info: StateInfo = {"observation": obs, "info": info} + trajectory.append(state_info) + + meta_data = {"action_history": ["None"]} + + trace = [] + while True: + early_stop_flag, stop_info = early_stop( + trajectory, max_steps, early_stop_thresholds + ) + + if early_stop_flag: + action = create_stop_action(f"Early stop: {stop_info}") + else: + prompt = agent.prompt_constructor.construct( + trajectory, intent, meta_data + ) + try: + action = agent.next_action( + trajectory, intent, meta_data=meta_data + ) + except ValueError as e: + # get the error message + action = create_stop_action(f"ERROR: {str(e)}") + + trajectory.append(action) + + action_str = get_action_description( + action, + state_info["info"]["observation_metadata"], + action_set_tag=args.action_set_tag, + prompt_constructor=agent.prompt_constructor + if isinstance(agent, PromptAgent) + else None, + ) + render_helper.render( + action, state_info, meta_data, args.render_screenshot + ) + meta_data["action_history"].append(action_str) + + trace.append({ + "source": prompt, + "target": action_str.split(' #HTML Segment')[0], + }) + + if action["action_type"] == ActionTypes.STOP: + break + + obs, _, terminated, _, info = env.step(action) + obs["text"] = obs["text"][0] + state_info = {"observation": obs, "info": info} + trajectory.append(state_info) + + if terminated: + # add a action place holder + trajectory.append(create_stop_action("")) + break + + evaluator = evaluator_router(config_file) + score = evaluator( + trajectory=trajectory, + config_file=config_file, + page=env.page, + client=env.get_page_client(env.page), + ) + + scores.append(score) + + if score == 1: + logger.info(f"[Result] (PASS) {config_file}") + else: + logger.info(f"[Result] (FAIL) {config_file}") + + if args.save_trace_enabled: + env.save_trace( + Path(args.result_dir) / "traces" / f"{task_id}.zip" + ) + result = { + "id": task_id, + "score": score, + "trace": trace, + } + with open(Path(args.result_dir) / "traces" / f"trace_{task_id}.json", "w") as f: + json.dump(result, f, indent=4) + + except openai.OpenAIError as e: + logger.info(f"[OpenAI Error] {repr(e)}") + except Exception as e: + logger.info(f"[Unhandled Error] {repr(e)}]") + import traceback + + # write to error file + with open(Path(args.result_dir) / "error.txt", "a") as f: + f.write(f"[Config file]: {config_file}\n") + f.write(f"[Unhandled Error] {repr(e)}\n") + f.write(traceback.format_exc()) # write stack trace to file + + env.close() + if len(scores) > 0: + logger.info(f"Average score: {sum(scores) / len(scores)}") + + +def prepare(args: argparse.Namespace) -> None: + # convert prompt python files to json + from agent.prompts import to_json + + to_json.run() + + # prepare result dir + result_dir = args.result_dir + if not result_dir: + result_dir = ( + f"cache/results_{time.strftime('%Y%m%d%H%M%S', time.localtime())}" + ) + if not Path(result_dir).exists(): + Path(result_dir).mkdir(parents=True, exist_ok=True) + args.result_dir = result_dir + logger.info(f"Create result dir: {result_dir}") + + if not (Path(result_dir) / "traces").exists(): + (Path(result_dir) / "traces").mkdir(parents=True) + + # log the log file + with open(os.path.join(result_dir, "log_files.txt"), "a+") as f: + f.write(f"{LOG_FILE_NAME}\n") + +def get_unfinished(config_files: list[str], result_dir: str) -> list[str]: + result_files = glob.glob(f"{result_dir}/traces/*.json") + task_ids = [ + os.path.basename(f).split(".")[0].split("_")[1] for f in result_files + ] + unfinished_configs = [] + for config_file in config_files: + task_id = os.path.basename(config_file).split(".")[0] + if task_id not in task_ids: + unfinished_configs.append(config_file) + return unfinished_configs + +def dump_config(args: argparse.Namespace) -> None: + config_file = Path(args.result_dir) / "config.json" + if not config_file.exists(): + with open(config_file, "w") as f: + json.dump(vars(args), f, indent=4) + logger.info(f"Dump config to {config_file}") + + +if __name__ == "__main__": + args = config() + args.sleep_after_execution = 2.0 + prepare(args) + + test_file_list = [] + st_idx = args.test_start_idx + ed_idx = args.test_end_idx + for i in range(st_idx, ed_idx): + if not os.path.exists(os.path.join(os.path.dirname(os.path.abspath(__file__)), "config_files", f"{i}.json")): + continue + test_file_list.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "config_files", f"{i}.json")) + + if len(test_file_list) == 0: + logger.info("No task left to run") + else: + print(f"Total {len(test_file_list)} tasks left") + args.render = False + args.render_screenshot = True + args.save_trace_enabled = True + + args.current_viewport_only = True + dump_config(args) + + agent = construct_agent(args) + test(args, agent, test_file_list)

IkJ%X&3Y?hK_UNfImkb=a|D9Lz-KPwLERP5~OvW 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

! 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≠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