browsergym-workarena 0.4.4__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- browsergym_workarena-0.5.0/CITATION.cff +81 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/PKG-INFO +9 -21
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/README.md +7 -20
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/requirements.txt +1 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/__init__.py +1 -1
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/config.py +6 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/install.py +56 -3
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/instance.py +101 -17
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/dashboard.py +20 -12
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +11 -2
- browsergym_workarena-0.4.4/src/browsergym/workarena/tasks/scripts/navigation.py → browsergym_workarena-0.5.0/src/browsergym/workarena/tasks/scripts/generate_navigation_tasks.py +4 -1
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/knowledge.py +6 -4
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/wa_action_traces.py +9 -2
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/workflows/pypi.yml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/workflows/unit_tests.yml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.gitignore +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/CODE_OF_CONDUCT.md +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/LICENSE +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/SECURITY.md +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/assets/WorkArena_banner.png +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/dcat-metadata.jsonld +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/dev/environment.yaml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/dev/requirements.txt +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/generate_knowledge_base.ipynb +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/make_human_eval_curriculum.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/pyproject.toml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/extract_finetuning_traces.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/generate_knowledge_base.ipynb +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/make_human_eval_curriculum.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/__init__.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/category.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/change_request.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/computer_asset.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/cost_center.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/expense_line.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/incident.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/knowledge.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/problem.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/report.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/requested_items.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/requests.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/system_properties.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/ui_themes.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/user.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/utils.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_change_request_form_fields.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_hardware_form_fields.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_problem_form_fields.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_user_form_fields.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/kb_autopublish_workflow.xml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/knowledge_base.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/protocols.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/test.html +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/ui_themes/workarena_themes.xml +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/all_menu.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_change_request_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_hardware_asset_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_incident_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_problem_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_user_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_asset_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_change_request_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_hardware_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_incident_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_user_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/impersonation_users.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/knowledge_base_configs.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_apple_mac_book_pro15_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_apple_watch_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_developer_laptop_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_development_laptop_pc_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_ipad_mini_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_asset_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_incident_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_service_catalog_item_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_user_list_task.json +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/human_eval/console.js +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/human_eval/tool.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/__init__.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/base.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/comp_building_block.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/__init__.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/base.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_base.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_catalog.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_filter.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_request_item.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/delete_record.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/edit_knowledge_base.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/expense_management.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/filter_and_do.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/find_and_order_item.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/maximize_investment_return.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/navigate_and_do.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/offboard_user.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/onboard_user.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/update_task.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/utils/curriculum.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/utils/knapsack.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/warranty_check.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/work_assignment.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/workload_balancing.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/form.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/knowledge.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/list.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/mark_duplicate_problem.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/navigation.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/README.md +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/extract_all_menu_items.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/generate_forms.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/list.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/service_catalog.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/validate.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/send_chat_message.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/service_catalog.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/__init__.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/debug.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/form.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/js_utils.js +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/private_tasks.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/string.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/utils.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/utils.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/workarena_test.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_api.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_compositional.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_compositional_utils.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_filter_list_task.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_random_config_generation.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_snow_instance.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_task_from_config.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_task_general.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_task_setup.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_utils.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_validate.py +0 -0
- {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/utils.py +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use WorkArena in your research, please cite both of the following papers."
|
|
3
|
+
title: "WorkArena"
|
|
4
|
+
date-released: 2024-03-12
|
|
5
|
+
url: "https://github.com/ServiceNow/workarena"
|
|
6
|
+
license: "Apache-2.0"
|
|
7
|
+
|
|
8
|
+
authors:
|
|
9
|
+
- family-names: Drouin
|
|
10
|
+
given-names: Alexandre
|
|
11
|
+
- family-names: Gasse
|
|
12
|
+
given-names: Maxime
|
|
13
|
+
- family-names: Caccia
|
|
14
|
+
given-names: Massimo
|
|
15
|
+
- family-names: Laradji
|
|
16
|
+
given-names: Issam H.
|
|
17
|
+
- family-names: Del Verme
|
|
18
|
+
given-names: Manuel
|
|
19
|
+
- family-names: Marty
|
|
20
|
+
given-names: Tom
|
|
21
|
+
- family-names: Vazquez
|
|
22
|
+
given-names: David
|
|
23
|
+
- family-names: Chapados
|
|
24
|
+
given-names: Nicolas
|
|
25
|
+
- family-names: Lacoste
|
|
26
|
+
given-names: Alexandre
|
|
27
|
+
|
|
28
|
+
preferred-citation:
|
|
29
|
+
- type: inproceedings
|
|
30
|
+
title: "WorkArena: How Capable are Web Agents at Solving Common Knowledge Work Tasks?"
|
|
31
|
+
authors:
|
|
32
|
+
- family-names: Drouin
|
|
33
|
+
given-names: Alexandre
|
|
34
|
+
- family-names: Gasse
|
|
35
|
+
given-names: Maxime
|
|
36
|
+
- family-names: Caccia
|
|
37
|
+
given-names: Massimo
|
|
38
|
+
- family-names: Laradji
|
|
39
|
+
given-names: Issam H.
|
|
40
|
+
- family-names: Del Verme
|
|
41
|
+
given-names: Manuel
|
|
42
|
+
- family-names: Marty
|
|
43
|
+
given-names: Tom
|
|
44
|
+
- family-names: Vazquez
|
|
45
|
+
given-names: David
|
|
46
|
+
- family-names: Chapados
|
|
47
|
+
given-names: Nicolas
|
|
48
|
+
- family-names: Lacoste
|
|
49
|
+
given-names: Alexandre
|
|
50
|
+
booktitle: "Proceedings of the 41st International Conference on Machine Learning (ICML)"
|
|
51
|
+
series: "Proceedings of Machine Learning Research"
|
|
52
|
+
volume: 235
|
|
53
|
+
pages: "11642–11662"
|
|
54
|
+
year: 2024
|
|
55
|
+
url: "https://proceedings.mlr.press/v235/drouin24a.html"
|
|
56
|
+
|
|
57
|
+
- type: inproceedings
|
|
58
|
+
title: "WorkArena++: Towards Compositional Planning and Reasoning-based Common Knowledge Work Tasks"
|
|
59
|
+
authors:
|
|
60
|
+
- family-names: Boisvert
|
|
61
|
+
given-names: Léo
|
|
62
|
+
- family-names: Thakkar
|
|
63
|
+
given-names: Megh
|
|
64
|
+
- family-names: Gasse
|
|
65
|
+
given-names: Maxime
|
|
66
|
+
- family-names: Caccia
|
|
67
|
+
given-names: Massimo
|
|
68
|
+
- family-names: Le Sellier De Chezelles
|
|
69
|
+
given-names: Thibault
|
|
70
|
+
- family-names: Cappart
|
|
71
|
+
given-names: Quentin
|
|
72
|
+
- family-names: Chapados
|
|
73
|
+
given-names: Nicolas
|
|
74
|
+
- family-names: Lacoste
|
|
75
|
+
given-names: Alexandre
|
|
76
|
+
- family-names: Drouin
|
|
77
|
+
given-names: Alexandre
|
|
78
|
+
booktitle: "Advances in Neural Information Processing Systems 37 (NeurIPS 2024), Datasets & Benchmarks Track"
|
|
79
|
+
year: 2024
|
|
80
|
+
url: "https://proceedings.neurips.cc/paper_files/paper/2024/hash/0b82662b6c32e887bb252a74d8cb2d5e-Paper-Datasets_and_Benchmarks_Track.pdf"
|
|
81
|
+
doi: "10.52202/079017-0195"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: browsergym-workarena
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: WorkArena benchmark for BrowserGym
|
|
5
5
|
Project-URL: homepage, https://github.com/ServiceNow/WorkArena
|
|
6
6
|
Author: Léo Boisvert, Alex Drouin, Maxime Gasse, Alex Lacoste, Manuel Del Verme, Megh Thakkar
|
|
@@ -16,6 +16,7 @@ Requires-Python: >3.7
|
|
|
16
16
|
Requires-Dist: browsergym-core>=0.2
|
|
17
17
|
Requires-Dist: english-words>=2.0.1
|
|
18
18
|
Requires-Dist: faker>=24.8.0
|
|
19
|
+
Requires-Dist: huggingface-hub>=0.23
|
|
19
20
|
Requires-Dist: numpy>=1.14
|
|
20
21
|
Requires-Dist: requests>=2.31
|
|
21
22
|
Requires-Dist: tenacity>=8.2.3
|
|
@@ -65,28 +66,19 @@ https://github.com/ServiceNow/WorkArena/assets/2374980/68640f09-7d6f-4eb1-b556-c
|
|
|
65
66
|
|
|
66
67
|
## Getting Started
|
|
67
68
|
|
|
68
|
-
To setup WorkArena, you will need to
|
|
69
|
+
To setup WorkArena, you will need to gain access to ServiceNow instances and install our Python package locally. Follow the steps below to achieve this.
|
|
69
70
|
|
|
70
|
-
### a)
|
|
71
|
+
### a) Gain Access to ServiceNow Instances
|
|
71
72
|
|
|
72
|
-
1.
|
|
73
|
-
2.
|
|
74
|
-
3.
|
|
75
|
-
4. Change the role of the user to admin in yoyr instance parameters 
|
|
73
|
+
1. Navigate to https://huggingface.co/datasets/ServiceNow/WorkArena-Instances.
|
|
74
|
+
2. Fill the form, accept the terms to gain access to the gated repository and wait for approval.
|
|
75
|
+
3. Ensure that the machine where you will run WorkArena is [authenticated with Hugging Face](https://huggingface.co/docs/hub/en/datasets-polars-auth) (e.g., via huggingface-cli login or the HUGGING_FACE_HUB_TOKEN environment variable).
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
* `SNOW_INSTANCE_URL`: The URL of your ServiceNow developer instance
|
|
79
|
-
* `SNOW_INSTANCE_UNAME`: The username, should be "admin"
|
|
80
|
-
* `SNOW_INSTANCE_PWD`: The password, make sure you place the value in quotes "" and be mindful of [escaping special shell characters](https://onlinelinuxtools.com/escape-shell-characters). Running `echo $SNOW_INSTANCE_PWD` should print the correct password.
|
|
81
|
-
6. Log into your instance via a browser using the admin credentials. Close any popup that appears on the main screen (e.g., agreeing to analytics).
|
|
82
|
-
|
|
83
|
-
**Warning:** Feel free to look around the platform, but please make sure you revert any changes (e.g., changes to list views, pinning some menus, etc.) as these changes will be persistent and affect the benchmarking process.
|
|
84
|
-
|
|
85
|
-
### b) Install WorkArena and Initialize your Instance
|
|
77
|
+
### b) Install WorkArena
|
|
86
78
|
|
|
87
79
|
Run the following command to install WorkArena in the [BrowswerGym](https://github.com/servicenow/browsergym) environment:
|
|
88
80
|
```
|
|
89
|
-
pip install browsergym
|
|
81
|
+
pip install browsergym-workarena
|
|
90
82
|
```
|
|
91
83
|
|
|
92
84
|
Then, install [Playwright](https://github.com/microsoft/playwright):
|
|
@@ -94,10 +86,6 @@ Then, install [Playwright](https://github.com/microsoft/playwright):
|
|
|
94
86
|
playwright install
|
|
95
87
|
```
|
|
96
88
|
|
|
97
|
-
Finally, run this command in a terminal to upload the benchmark data to your ServiceNow instance:
|
|
98
|
-
```
|
|
99
|
-
workarena-install
|
|
100
|
-
```
|
|
101
89
|
Your installation is now complete! 🎉
|
|
102
90
|
|
|
103
91
|
|
|
@@ -41,28 +41,19 @@ https://github.com/ServiceNow/WorkArena/assets/2374980/68640f09-7d6f-4eb1-b556-c
|
|
|
41
41
|
|
|
42
42
|
## Getting Started
|
|
43
43
|
|
|
44
|
-
To setup WorkArena, you will need to
|
|
44
|
+
To setup WorkArena, you will need to gain access to ServiceNow instances and install our Python package locally. Follow the steps below to achieve this.
|
|
45
45
|
|
|
46
|
-
### a)
|
|
46
|
+
### a) Gain Access to ServiceNow Instances
|
|
47
47
|
|
|
48
|
-
1.
|
|
49
|
-
2.
|
|
50
|
-
3.
|
|
51
|
-
4. Change the role of the user to admin in yoyr instance parameters 
|
|
48
|
+
1. Navigate to https://huggingface.co/datasets/ServiceNow/WorkArena-Instances.
|
|
49
|
+
2. Fill the form, accept the terms to gain access to the gated repository and wait for approval.
|
|
50
|
+
3. Ensure that the machine where you will run WorkArena is [authenticated with Hugging Face](https://huggingface.co/docs/hub/en/datasets-polars-auth) (e.g., via huggingface-cli login or the HUGGING_FACE_HUB_TOKEN environment variable).
|
|
52
51
|
|
|
53
|
-
|
|
54
|
-
* `SNOW_INSTANCE_URL`: The URL of your ServiceNow developer instance
|
|
55
|
-
* `SNOW_INSTANCE_UNAME`: The username, should be "admin"
|
|
56
|
-
* `SNOW_INSTANCE_PWD`: The password, make sure you place the value in quotes "" and be mindful of [escaping special shell characters](https://onlinelinuxtools.com/escape-shell-characters). Running `echo $SNOW_INSTANCE_PWD` should print the correct password.
|
|
57
|
-
6. Log into your instance via a browser using the admin credentials. Close any popup that appears on the main screen (e.g., agreeing to analytics).
|
|
58
|
-
|
|
59
|
-
**Warning:** Feel free to look around the platform, but please make sure you revert any changes (e.g., changes to list views, pinning some menus, etc.) as these changes will be persistent and affect the benchmarking process.
|
|
60
|
-
|
|
61
|
-
### b) Install WorkArena and Initialize your Instance
|
|
52
|
+
### b) Install WorkArena
|
|
62
53
|
|
|
63
54
|
Run the following command to install WorkArena in the [BrowswerGym](https://github.com/servicenow/browsergym) environment:
|
|
64
55
|
```
|
|
65
|
-
pip install browsergym
|
|
56
|
+
pip install browsergym-workarena
|
|
66
57
|
```
|
|
67
58
|
|
|
68
59
|
Then, install [Playwright](https://github.com/microsoft/playwright):
|
|
@@ -70,10 +61,6 @@ Then, install [Playwright](https://github.com/microsoft/playwright):
|
|
|
70
61
|
playwright install
|
|
71
62
|
```
|
|
72
63
|
|
|
73
|
-
Finally, run this command in a terminal to upload the benchmark data to your ServiceNow instance:
|
|
74
|
-
```
|
|
75
|
-
workarena-install
|
|
76
|
-
```
|
|
77
64
|
Your installation is now complete! 🎉
|
|
78
65
|
|
|
79
66
|
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/config.py
RENAMED
|
@@ -11,6 +11,12 @@ SNOW_BROWSER_TIMEOUT = 30000 # Milliseconds
|
|
|
11
11
|
SNOW_JS_UTILS_FILEPATH = str(resources.files(utils).joinpath("js_utils.js"))
|
|
12
12
|
SNOW_SUPPORTED_RELEASES = ["washingtondc"]
|
|
13
13
|
|
|
14
|
+
# Hugging Face dataset containing available instances
|
|
15
|
+
INSTANCE_REPO_ID = "ServiceNow/WorkArena-Instances"
|
|
16
|
+
INSTANCE_REPO_FILENAME = "instances.json"
|
|
17
|
+
INSTANCE_REPO_TYPE = "dataset"
|
|
18
|
+
INSTANCE_XOR_SEED = "x3!+-9mi#nhlo%a02$9hna{]"
|
|
19
|
+
|
|
14
20
|
# Path to the Menu navigation task configuration
|
|
15
21
|
ALL_MENU_PATH = str(resources.files(data_files).joinpath("task_configs/all_menu.json"))
|
|
16
22
|
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/install.py
RENAMED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
1
4
|
import html
|
|
2
5
|
import json
|
|
3
6
|
import logging
|
|
@@ -48,10 +51,36 @@ from .config import (
|
|
|
48
51
|
UI_THEMES_UPDATE_SET,
|
|
49
52
|
)
|
|
50
53
|
from .api.user import set_user_preference
|
|
51
|
-
from .instance import SNowInstance
|
|
54
|
+
from .instance import SNowInstance as _BaseSNowInstance
|
|
52
55
|
from .utils import url_login
|
|
53
56
|
|
|
54
57
|
|
|
58
|
+
_CLI_INSTANCE_URL: str | None = None
|
|
59
|
+
_CLI_INSTANCE_PASSWORD: str | None = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def SNowInstance(snow_credentials: tuple[str, str] | None = None):
|
|
63
|
+
"""
|
|
64
|
+
Wrapper around the standard SNowInstance that uses CLI-provided instance URL and password if none are provided.
|
|
65
|
+
"""
|
|
66
|
+
if not _CLI_INSTANCE_URL:
|
|
67
|
+
raise RuntimeError("Installer requires --instance-url to create a SNowInstance.")
|
|
68
|
+
|
|
69
|
+
resolved_creds = snow_credentials
|
|
70
|
+
|
|
71
|
+
if resolved_creds is None:
|
|
72
|
+
if not _CLI_INSTANCE_PASSWORD:
|
|
73
|
+
raise RuntimeError(
|
|
74
|
+
"Installer requires --instance-password (or explicit credentials) to create a SNowInstance."
|
|
75
|
+
)
|
|
76
|
+
resolved_creds = ("admin", _CLI_INSTANCE_PASSWORD)
|
|
77
|
+
|
|
78
|
+
return _BaseSNowInstance(
|
|
79
|
+
snow_url=_CLI_INSTANCE_URL,
|
|
80
|
+
snow_credentials=resolved_creds,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
55
84
|
def _is_dev_portal_instance() -> bool:
|
|
56
85
|
"""
|
|
57
86
|
Check if the instance is a ServiceNow Developer Portal instance.
|
|
@@ -790,13 +819,20 @@ def disable_password_policies():
|
|
|
790
819
|
set_sys_property(
|
|
791
820
|
instance=SNowInstance(), property_name="glide.apply.password_policy.on_login", value="false"
|
|
792
821
|
)
|
|
793
|
-
#
|
|
794
|
-
|
|
822
|
+
# Exception handling since this property is sometimes read-only on some instances
|
|
823
|
+
try:
|
|
795
824
|
set_sys_property(
|
|
796
825
|
instance=SNowInstance(),
|
|
797
826
|
property_name="glide.authenticate.api.user.reset_password.mandatory",
|
|
798
827
|
value="false",
|
|
799
828
|
)
|
|
829
|
+
except Exception:
|
|
830
|
+
logging.warning(
|
|
831
|
+
"Warning: Failed to set sys property "
|
|
832
|
+
"'glide.authenticate.api.user.reset_password.mandatory'. Continuing.",
|
|
833
|
+
exc_info=True,
|
|
834
|
+
)
|
|
835
|
+
|
|
800
836
|
logging.info("Password policies disabled.")
|
|
801
837
|
|
|
802
838
|
|
|
@@ -1098,6 +1134,23 @@ def main():
|
|
|
1098
1134
|
Entrypoint for package CLI installation command
|
|
1099
1135
|
|
|
1100
1136
|
"""
|
|
1137
|
+
parser = argparse.ArgumentParser(
|
|
1138
|
+
description="Install WorkArena artifacts on a ServiceNow instance."
|
|
1139
|
+
)
|
|
1140
|
+
parser.add_argument(
|
|
1141
|
+
"--instance-url", required=True, help="URL of the target ServiceNow instance."
|
|
1142
|
+
)
|
|
1143
|
+
parser.add_argument(
|
|
1144
|
+
"--instance-password",
|
|
1145
|
+
required=True,
|
|
1146
|
+
help="Password for the admin user on the target ServiceNow instance.",
|
|
1147
|
+
)
|
|
1148
|
+
args = parser.parse_args()
|
|
1149
|
+
|
|
1150
|
+
global _CLI_INSTANCE_URL, _CLI_INSTANCE_PASSWORD
|
|
1151
|
+
_CLI_INSTANCE_URL = args.instance_url
|
|
1152
|
+
_CLI_INSTANCE_PASSWORD = args.instance_password
|
|
1153
|
+
|
|
1101
1154
|
logging.basicConfig(level=logging.INFO)
|
|
1102
1155
|
|
|
1103
1156
|
try:
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/instance.py
RENAMED
|
@@ -1,12 +1,88 @@
|
|
|
1
|
+
import base64
|
|
1
2
|
import json
|
|
3
|
+
import logging
|
|
2
4
|
import os
|
|
5
|
+
import random
|
|
3
6
|
import requests
|
|
4
|
-
import
|
|
7
|
+
from itertools import cycle
|
|
5
8
|
|
|
9
|
+
from huggingface_hub import hf_hub_download
|
|
10
|
+
from huggingface_hub.utils import disable_progress_bars
|
|
6
11
|
from playwright.sync_api import sync_playwright
|
|
7
12
|
from typing import Optional
|
|
8
13
|
|
|
9
|
-
from .config import
|
|
14
|
+
from .config import (
|
|
15
|
+
INSTANCE_REPO_FILENAME,
|
|
16
|
+
INSTANCE_REPO_ID,
|
|
17
|
+
INSTANCE_REPO_TYPE,
|
|
18
|
+
INSTANCE_XOR_SEED,
|
|
19
|
+
REPORT_FILTER_PROPERTY,
|
|
20
|
+
SNOW_BROWSER_TIMEOUT,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Required to read the instance credentials
|
|
25
|
+
if not INSTANCE_XOR_SEED:
|
|
26
|
+
raise ValueError("INSTANCE_XOR_SEED must be configured")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _xor_cipher(data: bytes, key: bytes) -> bytes:
|
|
30
|
+
return bytes(b ^ k for b, k in zip(data, cycle(key)))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def decrypt_instance_password(encrypted_password: str) -> str:
|
|
34
|
+
"""Decrypt a base64-encoded XOR-obfuscated password using the shared key."""
|
|
35
|
+
|
|
36
|
+
cipher_bytes = base64.b64decode(encrypted_password)
|
|
37
|
+
plain_bytes = _xor_cipher(cipher_bytes, INSTANCE_XOR_SEED.encode("utf-8"))
|
|
38
|
+
return plain_bytes.decode("utf-8")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def encrypt_instance_password(password: str) -> str:
|
|
42
|
+
"""Helper to produce encrypted passwords for populating the instance file."""
|
|
43
|
+
|
|
44
|
+
cipher_bytes = _xor_cipher(password.encode("utf-8"), INSTANCE_XOR_SEED.encode("utf-8"))
|
|
45
|
+
return base64.b64encode(cipher_bytes).decode("utf-8")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def fetch_instances():
|
|
49
|
+
"""
|
|
50
|
+
Load the latest instances from either a custom pool (SNOW_INSTANCE_POOL env var) or the gated HF dataset.
|
|
51
|
+
"""
|
|
52
|
+
pool_path = os.getenv("SNOW_INSTANCE_POOL")
|
|
53
|
+
if pool_path:
|
|
54
|
+
path = os.path.expanduser(pool_path)
|
|
55
|
+
if not os.path.exists(path):
|
|
56
|
+
raise FileNotFoundError(
|
|
57
|
+
f"SNOW_INSTANCE_POOL points to '{pool_path}', but the file does not exist."
|
|
58
|
+
)
|
|
59
|
+
logging.info("Loading ServiceNow instances from custom pool: %s", path)
|
|
60
|
+
else:
|
|
61
|
+
try:
|
|
62
|
+
disable_progress_bars()
|
|
63
|
+
path = hf_hub_download(
|
|
64
|
+
repo_id=INSTANCE_REPO_ID,
|
|
65
|
+
filename=INSTANCE_REPO_FILENAME,
|
|
66
|
+
repo_type=INSTANCE_REPO_TYPE,
|
|
67
|
+
)
|
|
68
|
+
logging.info("Loaded ServiceNow instances from the default instance pool.")
|
|
69
|
+
except Exception as e:
|
|
70
|
+
raise RuntimeError(
|
|
71
|
+
f"Could not access {INSTANCE_REPO_ID}/{INSTANCE_REPO_FILENAME}. "
|
|
72
|
+
"Make sure you have been granted access to the gated repo and that you are "
|
|
73
|
+
"authenticated (run `huggingface-cli login` or set HUGGING_FACE_HUB_TOKEN)."
|
|
74
|
+
) from e
|
|
75
|
+
|
|
76
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
77
|
+
entries = json.load(f)
|
|
78
|
+
|
|
79
|
+
for entry in entries:
|
|
80
|
+
entry["url"] = entry["u"]
|
|
81
|
+
entry["password"] = decrypt_instance_password(entry["p"])
|
|
82
|
+
del entry["u"]
|
|
83
|
+
del entry["p"]
|
|
84
|
+
|
|
85
|
+
return entries
|
|
10
86
|
|
|
11
87
|
|
|
12
88
|
class SNowInstance:
|
|
@@ -26,31 +102,39 @@ class SNowInstance:
|
|
|
26
102
|
Parameters:
|
|
27
103
|
-----------
|
|
28
104
|
snow_url: str
|
|
29
|
-
The URL of a SNow instance.
|
|
105
|
+
The URL of a SNow instance. When omitted, the constructor first looks for SNOW_INSTANCE_URL and falls back
|
|
106
|
+
to a random instance from the benchmark's instance pool if the environment variable is not set.
|
|
30
107
|
snow_credentials: (str, str)
|
|
31
|
-
The username and password used to access the SNow instance.
|
|
32
|
-
|
|
108
|
+
The username and password used to access the SNow instance. When omitted, environment variables
|
|
109
|
+
SNOW_INSTANCE_UNAME/SNOW_INSTANCE_PWD are used if set; otherwise, a random instance from the benchmark's
|
|
110
|
+
instance pool is selected.
|
|
33
111
|
|
|
34
112
|
"""
|
|
35
113
|
# try to get these values from environment variables if not provided
|
|
36
|
-
if snow_url is None:
|
|
37
|
-
|
|
114
|
+
if snow_url is None or snow_credentials is None:
|
|
115
|
+
|
|
116
|
+
# Check if all required environment variables are set and if yes, fetch url and credentials from there
|
|
117
|
+
if (
|
|
118
|
+
"SNOW_INSTANCE_URL" in os.environ
|
|
119
|
+
and "SNOW_INSTANCE_UNAME" in os.environ
|
|
120
|
+
and "SNOW_INSTANCE_PWD" in os.environ
|
|
121
|
+
):
|
|
38
122
|
snow_url = os.environ["SNOW_INSTANCE_URL"]
|
|
39
|
-
else:
|
|
40
|
-
raise ValueError(
|
|
41
|
-
f"Please provide a ServiceNow instance URL (you can use the environment variable SNOW_INSTANCE_URL)"
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
if snow_credentials is None:
|
|
45
|
-
if "SNOW_INSTANCE_UNAME" in os.environ and "SNOW_INSTANCE_PWD" in os.environ:
|
|
46
123
|
snow_credentials = (
|
|
47
124
|
os.environ["SNOW_INSTANCE_UNAME"],
|
|
48
125
|
os.environ["SNOW_INSTANCE_PWD"],
|
|
49
126
|
)
|
|
127
|
+
|
|
128
|
+
# Otherwise, load all instances and select one randomly
|
|
50
129
|
else:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
130
|
+
instances = fetch_instances()
|
|
131
|
+
if not instances:
|
|
132
|
+
raise ValueError(
|
|
133
|
+
f"No instances found in the dataset {INSTANCE_REPO_ID}. Please provide instance details via parameters or environment variables."
|
|
134
|
+
)
|
|
135
|
+
instance = random.choice(instances)
|
|
136
|
+
snow_url = instance["url"]
|
|
137
|
+
snow_credentials = ("admin", instance["password"])
|
|
54
138
|
|
|
55
139
|
# remove trailing slashes in the URL, if any
|
|
56
140
|
self.snow_url = snow_url.rstrip("/")
|
|
@@ -29,15 +29,6 @@ from .utils.utils import check_url_suffix_match
|
|
|
29
29
|
# - We currently don't support maps because they are clickable and would require a more evolved cheat function
|
|
30
30
|
SUPPORTED_PLOT_TYPES = ["area", "bar", "column", "line", "pie", "spline"]
|
|
31
31
|
|
|
32
|
-
# Get report filter config
|
|
33
|
-
config = SNowInstance().report_filter_config
|
|
34
|
-
if config is None:
|
|
35
|
-
REPORT_DATE_FILTER = REPORT_TIME_FILTER = None
|
|
36
|
-
else:
|
|
37
|
-
REPORT_DATE_FILTER = config["report_date_filter"]
|
|
38
|
-
REPORT_TIME_FILTER = config["report_time_filter"]
|
|
39
|
-
del config
|
|
40
|
-
|
|
41
32
|
|
|
42
33
|
class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
|
|
43
34
|
"""
|
|
@@ -303,14 +294,28 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
|
|
|
303
294
|
""",
|
|
304
295
|
]
|
|
305
296
|
|
|
306
|
-
def
|
|
307
|
-
|
|
297
|
+
def _get_filter_config(self) -> str:
|
|
298
|
+
# Get report filter config
|
|
299
|
+
config = self.instance.report_filter_config
|
|
300
|
+
if config is None:
|
|
301
|
+
REPORT_DATE_FILTER = REPORT_TIME_FILTER = None
|
|
302
|
+
else:
|
|
303
|
+
REPORT_DATE_FILTER = config["report_date_filter"]
|
|
304
|
+
REPORT_TIME_FILTER = config["report_time_filter"]
|
|
305
|
+
del config
|
|
308
306
|
|
|
309
307
|
# Check that the report filters are properly setup
|
|
310
308
|
if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None:
|
|
311
309
|
raise RuntimeError(
|
|
312
310
|
"The report date and time filters are not set. Please run the install script to set them."
|
|
313
311
|
)
|
|
312
|
+
return REPORT_DATE_FILTER, REPORT_TIME_FILTER
|
|
313
|
+
|
|
314
|
+
def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str | dict]:
|
|
315
|
+
super().setup_goal(page=page)
|
|
316
|
+
|
|
317
|
+
# Get the instance report filter config
|
|
318
|
+
REPORT_DATE_FILTER, REPORT_TIME_FILTER = self._get_filter_config()
|
|
314
319
|
|
|
315
320
|
# Configure task
|
|
316
321
|
# ... sample a configuration
|
|
@@ -632,6 +637,9 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
|
|
|
632
637
|
The types of questions to sample from (uniformely)
|
|
633
638
|
|
|
634
639
|
"""
|
|
640
|
+
# Get the instance report filter config
|
|
641
|
+
REPORT_DATE_FILTER, REPORT_TIME_FILTER = self._get_filter_config()
|
|
642
|
+
|
|
635
643
|
# Check that the report filters are properly setup
|
|
636
644
|
if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None:
|
|
637
645
|
raise RuntimeError(
|
|
@@ -798,7 +806,7 @@ class SingleChartMeanMedianModeRetrievalTask(
|
|
|
798
806
|
|
|
799
807
|
|
|
800
808
|
class WorkLoadBalancingMinMaxRetrievalTask(
|
|
801
|
-
|
|
809
|
+
SingleChartMinMaxRetrievalTask, CompositionalBuildingBlockTask
|
|
802
810
|
):
|
|
803
811
|
def all_configs(self):
|
|
804
812
|
return json.load(open(REPORT_RETRIEVAL_MINMAX_CONFIG_PATH, "r"))
|
|
@@ -15,7 +15,6 @@ from playwright.sync_api import sync_playwright
|
|
|
15
15
|
|
|
16
16
|
from browsergym.workarena.api.utils import table_api_call, table_column_info
|
|
17
17
|
from browsergym.workarena.config import (
|
|
18
|
-
REPORT_DATE_FILTER,
|
|
19
18
|
REPORT_PATCH_FLAG,
|
|
20
19
|
REPORT_RETRIEVAL_MINMAX_CONFIG_PATH,
|
|
21
20
|
REPORT_RETRIEVAL_VALUE_CONFIG_PATH,
|
|
@@ -44,6 +43,10 @@ class DummyDashboard(DashboardRetrievalTask):
|
|
|
44
43
|
|
|
45
44
|
|
|
46
45
|
def get_report_urls(instance):
|
|
46
|
+
# Get the instance report filter config
|
|
47
|
+
REPORT_DATE_FILTER, REPORT_TIME_FILTER = instance._get_filter_config()
|
|
48
|
+
raise NotImplementedError("TODO: Include the time filter as in dashboard.py")
|
|
49
|
+
|
|
47
50
|
# Generate a bunch of reports on the fly based on valid table fields
|
|
48
51
|
ON_THE_FLY_REPORTS = []
|
|
49
52
|
for table in [
|
|
@@ -226,7 +229,13 @@ def get_all_configs_by_url(url, is_report):
|
|
|
226
229
|
|
|
227
230
|
|
|
228
231
|
if __name__ == "__main__":
|
|
229
|
-
|
|
232
|
+
|
|
233
|
+
# XXX: Make sure to specific the exact instance on which to generate configs (and not use a random one)
|
|
234
|
+
raise NotImplementedError(
|
|
235
|
+
"Make sure to specific instance URL and credentials below, then comment this line."
|
|
236
|
+
)
|
|
237
|
+
instance = SNowInstance(snow_url=None, snow_credentials=None)
|
|
238
|
+
|
|
230
239
|
reports = get_report_urls(instance)
|
|
231
240
|
gen_func = partial(get_all_configs_by_url, is_report=REPORT)
|
|
232
241
|
|
|
@@ -6,7 +6,10 @@ NUM_CONFIGS = 650 # number of impersonation tasks in the paper
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def get_all_impersonation_users():
|
|
9
|
-
|
|
9
|
+
raise NotImplementedError(
|
|
10
|
+
"Make sure to specific instance URL and credentials below, then comment this line."
|
|
11
|
+
)
|
|
12
|
+
instance = SNowInstance(snow_url=None, snow_credentials=None)
|
|
10
13
|
candidate_users = [
|
|
11
14
|
u["first_name"] + " " + u["last_name"]
|
|
12
15
|
for u in table_api_call(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# TODO: Can we delete this file?
|
|
1
2
|
import json
|
|
2
3
|
import random
|
|
3
4
|
|
|
@@ -9,9 +10,8 @@ from tenacity import retry, stop_after_attempt
|
|
|
9
10
|
from tqdm import tqdm
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
def generate_all_kb_configs(instance
|
|
13
|
+
def generate_all_kb_configs(instance, num_configs=1000) -> list[dict]:
|
|
13
14
|
"""Generate all possible KB configs"""
|
|
14
|
-
instance = instance if instance is not None else SNowInstance()
|
|
15
15
|
with open(KB_FILEPATH, "r") as f:
|
|
16
16
|
kb_entries = json.load(f)
|
|
17
17
|
all_configs = []
|
|
@@ -33,5 +33,7 @@ def generate_all_kb_configs(instance=None, num_configs=1000) -> list[dict]:
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
if __name__ == "__main__":
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
raise NotImplementedError(
|
|
37
|
+
"Make sure to specific instance URL and credentials below, then comment this line."
|
|
38
|
+
)
|
|
39
|
+
generate_all_kb_configs(instance=SNowInstance(snow_url=None))
|
|
@@ -111,8 +111,15 @@ def extract_trace(task_cls, headless=True):
|
|
|
111
111
|
monkey_patch_playwright(observation_callback=env._get_obs, trace_storage=trace)
|
|
112
112
|
|
|
113
113
|
env.reset()
|
|
114
|
-
|
|
115
|
-
env.
|
|
114
|
+
# For compositional tasks, we need to cheat on each subtask
|
|
115
|
+
if hasattr(env.task, 'subtasks'):
|
|
116
|
+
# This is a compositional task, solve each subtask
|
|
117
|
+
for subtask_idx in range(len(env.task.subtasks)):
|
|
118
|
+
env.task.cheat(env.page, env.chat.messages, subtask_idx)
|
|
119
|
+
else:
|
|
120
|
+
# This is a regular task
|
|
121
|
+
env.task.cheat(env.page, env.chat.messages)
|
|
122
|
+
env.close()
|
|
116
123
|
|
|
117
124
|
return trace
|
|
118
125
|
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/extract_finetuning_traces.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/generate_knowledge_base.ipynb
RENAMED
|
File without changes
|
{browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/make_human_eval_curriculum.py
RENAMED
|
File without changes
|