browsergym-workarena 0.2.1__py3-none-any.whl → 0.3.1__py3-none-any.whl

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.
Files changed (91) hide show
  1. browsergym/workarena/__init__.py +13 -1
  2. browsergym/workarena/api/category.py +74 -0
  3. browsergym/workarena/api/change_request.py +87 -0
  4. browsergym/workarena/api/computer_asset.py +90 -0
  5. browsergym/workarena/api/cost_center.py +19 -0
  6. browsergym/workarena/api/expense_line.py +89 -0
  7. browsergym/workarena/api/incident.py +45 -0
  8. browsergym/workarena/api/knowledge.py +29 -0
  9. browsergym/workarena/api/problem.py +90 -0
  10. browsergym/workarena/api/report.py +183 -0
  11. browsergym/workarena/api/requested_items.py +63 -0
  12. browsergym/workarena/api/user.py +11 -8
  13. browsergym/workarena/api/utils.py +47 -3
  14. browsergym/workarena/config.py +21 -1
  15. browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +1 -1
  16. browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +1 -0
  17. browsergym/workarena/data_files/setup_files/knowledge/protocols.json +46 -0
  18. browsergym/workarena/data_files/setup_files/knowledge/test.html +1 -0
  19. browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +2 -24
  20. browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +4 -40
  21. browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +12 -0
  22. browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +1 -42
  23. browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +2 -18
  24. browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +12 -0
  25. browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +12 -0
  26. browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +2 -19
  27. browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +3 -50
  28. browsergym/workarena/data_files/task_configs/all_menu.json +1 -1
  29. browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +1 -1
  30. browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +1 -1
  31. browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +1 -1
  32. browsergym/workarena/data_files/task_configs/impersonation_users.json +1 -1
  33. browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +1 -1
  34. browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +1 -1
  35. browsergym/workarena/human_eval/console.js +176 -0
  36. browsergym/workarena/human_eval/tool.py +366 -0
  37. browsergym/workarena/install.py +81 -20
  38. browsergym/workarena/tasks/base.py +55 -20
  39. browsergym/workarena/tasks/comp_building_block.py +4 -0
  40. browsergym/workarena/tasks/compositional/__init__.py +76 -0
  41. browsergym/workarena/tasks/compositional/base.py +364 -0
  42. browsergym/workarena/tasks/compositional/dash_do_base.py +1366 -0
  43. browsergym/workarena/tasks/compositional/dash_do_catalog.py +1127 -0
  44. browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +2047 -0
  45. browsergym/workarena/tasks/compositional/dash_do_create_incident.py +403 -0
  46. browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +278 -0
  47. browsergym/workarena/tasks/compositional/dash_do_create_problem.py +336 -0
  48. browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +235 -0
  49. browsergym/workarena/tasks/compositional/dash_do_filter.py +1600 -0
  50. browsergym/workarena/tasks/compositional/dash_do_request_item.py +1315 -0
  51. browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +693 -0
  52. browsergym/workarena/tasks/compositional/delete_record.py +341 -0
  53. browsergym/workarena/tasks/compositional/edit_knowledge_base.py +457 -0
  54. browsergym/workarena/tasks/compositional/expense_management.py +598 -0
  55. browsergym/workarena/tasks/compositional/filter_and_do.py +139 -0
  56. browsergym/workarena/tasks/compositional/find_and_order_item.py +345 -0
  57. browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +1417 -0
  58. browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +499 -0
  59. browsergym/workarena/tasks/compositional/maximize_investment_return.py +1763 -0
  60. browsergym/workarena/tasks/compositional/navigate_and_do.py +1151 -0
  61. browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +2100 -0
  62. browsergym/workarena/tasks/compositional/offboard_user.py +207 -0
  63. browsergym/workarena/tasks/compositional/onboard_user.py +226 -0
  64. browsergym/workarena/tasks/compositional/update_task.py +145 -0
  65. browsergym/workarena/tasks/compositional/utils/curriculum.py +215 -0
  66. browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +151 -0
  67. browsergym/workarena/tasks/compositional/utils/knapsack.py +192 -0
  68. browsergym/workarena/tasks/compositional/warranty_check.py +227 -0
  69. browsergym/workarena/tasks/compositional/work_assignment.py +804 -0
  70. browsergym/workarena/tasks/compositional/workload_balancing.py +396 -0
  71. browsergym/workarena/tasks/dashboard.py +194 -12
  72. browsergym/workarena/tasks/form.py +1024 -232
  73. browsergym/workarena/tasks/knowledge.py +216 -25
  74. browsergym/workarena/tasks/list.py +519 -102
  75. browsergym/workarena/tasks/mark_duplicate_problem.py +171 -0
  76. browsergym/workarena/tasks/navigation.py +55 -13
  77. browsergym/workarena/tasks/scripts/extract_all_menu_items.py +9 -2
  78. browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +6 -5
  79. browsergym/workarena/tasks/scripts/service_catalog.py +2 -1
  80. browsergym/workarena/tasks/scripts/validate.py +8 -2
  81. browsergym/workarena/tasks/send_chat_message.py +90 -0
  82. browsergym/workarena/tasks/service_catalog.py +94 -26
  83. browsergym/workarena/tasks/utils/form.py +1 -4
  84. browsergym/workarena/tasks/utils/private_tasks.py +63 -0
  85. browsergym/workarena/tasks/utils/utils.py +13 -0
  86. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/METADATA +19 -18
  87. browsergym_workarena-0.3.1.dist-info/RECORD +138 -0
  88. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/entry_points.txt +1 -0
  89. browsergym_workarena-0.2.1.dist-info/RECORD +0 -85
  90. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/WHEEL +0 -0
  91. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/licenses/LICENSE +0 -0
@@ -10,6 +10,7 @@ import numpy as np
10
10
  import playwright.sync_api
11
11
 
12
12
  from playwright.sync_api import Page
13
+ import re
13
14
  from time import sleep
14
15
  from urllib import parse
15
16
 
@@ -60,7 +61,10 @@ META_CONFIGS = {
60
61
  "iPad mini": {
61
62
  "desc": "Request for iPad mini",
62
63
  "options": {
63
- "Choose the colour": ("radio", ["Space Grey", "Pink", "Purple", "Starlight"]),
64
+ "Choose the colour": (
65
+ "radio",
66
+ ["Space Grey", "Pink", "Purple", "Starlight"],
67
+ ),
64
68
  "Choose the storage": ("radio", ["64", "256"]),
65
69
  },
66
70
  },
@@ -150,21 +154,25 @@ class OrderHardwareTask(AbstractServiceNowTask):
150
154
  Random seed
151
155
  instance: SNowInstance
152
156
  The instance to use.
157
+ fixed_request_item: str
158
+ The item to order. If provided, the task will always order this item.
153
159
  fixed_config: dict
154
160
  Configuration to use for the task. If provided, the task will use the provided configuration instead of
155
161
  selecting a random one. See browsergym/workarena/data_files/task_configs/order_ipda_pro_task.json
156
162
  for an example of a configuration file.
157
- config_path:
158
- The path to the JSON file containing all configurations for the task. Provided by subclasses
163
+ config_only_in_desc: bool
164
+ If True, the model to order will be omitted from the task description in comp tasks.
165
+
159
166
  """
160
167
 
161
168
  def __init__(
162
169
  self,
163
- seed: int,
170
+ seed: int = None,
164
171
  instance: SNowInstance = None,
165
172
  fixed_request_item: str = None,
166
173
  fixed_config: dict = None,
167
- config_path: str = None,
174
+ config_only_in_desc: bool = False,
175
+ **kwargs,
168
176
  ):
169
177
  super().__init__(
170
178
  seed=seed,
@@ -178,12 +186,19 @@ class OrderHardwareTask(AbstractServiceNowTask):
178
186
  raise ValueError(f"'fixed_request_item' and 'fixed_config[\"item\"]' do not match")
179
187
 
180
188
  self.fixed_config = fixed_config
189
+ self.config = None
181
190
  self.fixed_request_item = fixed_request_item
191
+ self.config_only_in_desc = config_only_in_desc
182
192
 
183
193
  self.js_prefix = "gsft_main"
184
194
  self.js_api_forms = "g_form"
185
- with open(config_path, "r") as f:
186
- self.all_configs = json.load(f)
195
+ self.all_configs = self.all_configs()
196
+ self.__dict__.update(kwargs)
197
+
198
+ @classmethod
199
+ def all_configs(cls) -> List[dict]:
200
+ with open(cls.config_path, "r") as f:
201
+ return json.load(f)
187
202
 
188
203
  def _wait_for_ready(self, page: Page, wait_for_form_api: bool = False) -> None:
189
204
  """
@@ -266,14 +281,19 @@ class OrderHardwareTask(AbstractServiceNowTask):
266
281
 
267
282
  # Get the task configuration
268
283
  assert self.all_configs is not None, "No configuration available for the task."
269
- config = self.fixed_config if self.fixed_config else self.random.choice(self.all_configs)
270
- self.requested_item = config["item"]
271
- self.short_description = config["description"]
272
- self.quantity = config["quantity"]
273
- self.requested_configuration = config["configuration"]
284
+ self.config = (
285
+ self.fixed_config if self.fixed_config else self.random.choice(self.all_configs)
286
+ )
287
+ self.requested_item = self.config["item"]
288
+ self.short_description = self.config["description"]
289
+ self.quantity = self.config["quantity"]
290
+ self.requested_configuration = self.config["configuration"]
274
291
 
275
292
  # Generate goal
276
- goal = f'Go to the hardware store and order {self.quantity} "{self.requested_item}"'
293
+ if self.config_only_in_desc:
294
+ goal = self.get_pretty_printed_description()
295
+ else:
296
+ goal = f'Go to the hardware store and order {self.quantity} "{self.requested_item}"'
277
297
  if len(self.requested_configuration) > 0:
278
298
  goal += f" with configuration {dict((k, v[1]) for k, v in self.requested_configuration.items())}"
279
299
  info = {}
@@ -359,6 +379,9 @@ class OrderHardwareTask(AbstractServiceNowTask):
359
379
 
360
380
  def _generate_random_config(self, page: Page):
361
381
  """Generate a random configuration for the task"""
382
+ self.task_is_setup = (
383
+ False # This is a hack to avoid raising an exception in the setup method
384
+ )
362
385
  self.setup(page=page, do_start=False)
363
386
  if self.fixed_request_item:
364
387
  self.requested_item = self.fixed_request_item
@@ -404,6 +427,39 @@ class OrderHardwareTask(AbstractServiceNowTask):
404
427
  raise ValueError(f"Unknown control type {control_type}")
405
428
  return control_text
406
429
 
430
+ def get_pretty_printed_description(self) -> str:
431
+ """
432
+ Get the task info for this task when used in a private task; Used in L3 compositional tasks.
433
+ called by subclasses
434
+ """
435
+ class_name = self.__class__.__name__
436
+ class_name = class_name.replace("Task", "")
437
+ # Split the words
438
+ words = re.findall(r"[A-Z][^A-Z]*", class_name)
439
+ class_name_formatted = " ".join(words)
440
+ task_specs = {
441
+ "Quantity": self.config["quantity"],
442
+ "Configuration": self.config["configuration"],
443
+ }
444
+ if self.config_only_in_desc:
445
+ task_info = f"- Order the item in the following quantities and with the following configuration:\n"
446
+ else:
447
+ task_specs["Description"] = self.config["description"]
448
+ task_info = f"- {class_name_formatted} with the following specifications:\n"
449
+ for k, v in task_specs.items():
450
+ # Some values might be empty - like the configuration of the apple watch. It is more natural to exclude them
451
+ if not v:
452
+ continue
453
+ # If the value is a dictionary, print it in a nested way
454
+ if isinstance(v, dict):
455
+ task_info += f" - {k}:\n"
456
+ for k2, v2 in v.items():
457
+ task_info += f" - {k2}: {v2[1]}\n"
458
+ else:
459
+ task_info += f" - {k}: {v}\n"
460
+
461
+ return task_info
462
+
407
463
  def teardown(self) -> None:
408
464
  """
409
465
  Deletes the request (and automatically all its items)
@@ -428,9 +484,7 @@ class OrderHardwareTask(AbstractServiceNowTask):
428
484
  )
429
485
 
430
486
  # Retrieve the request sysid from the URL
431
- current_url = parse.urlparse(
432
- parse.unquote(self.page.evaluate("() => window.location.href"))
433
- )
487
+ current_url = parse.urlparse(parse.unquote(page.evaluate("() => window.location.href")))
434
488
  (self.request_sysid,) = parse.parse_qs(current_url.query).get("sysparm_sys_id", [None])
435
489
  if self.request_sysid is None:
436
490
  return (
@@ -496,7 +550,12 @@ class OrderHardwareTask(AbstractServiceNowTask):
496
550
  {"message": error_msg},
497
551
  )
498
552
 
499
- return 1, True, "Nice work, thank you!", {"message": "Task completed successfully."}
553
+ return (
554
+ 1,
555
+ True,
556
+ "Nice work, thank you!",
557
+ {"message": "Task completed successfully."},
558
+ )
500
559
 
501
560
 
502
561
  def option_match_heuristic(value, option):
@@ -510,91 +569,100 @@ def option_match_heuristic(value, option):
510
569
 
511
570
 
512
571
  class OrderDeveloperLaptopTask(OrderHardwareTask):
572
+ config_path = ORDER_DEVELOPER_LAPTOP_TASK_CONFIG_PATH
573
+
513
574
  def __init__(self, *args, **kwargs):
514
575
  super().__init__(
515
576
  *args,
516
577
  fixed_request_item="Developer Laptop (Mac)",
517
- config_path=ORDER_DEVELOPER_LAPTOP_TASK_CONFIG_PATH,
518
578
  **kwargs,
519
579
  )
520
580
 
521
581
 
522
582
  class OrderIpadMiniTask(OrderHardwareTask):
583
+ config_path = ORDER_IPAD_MINI_TASK_CONFIG_PATH
584
+
523
585
  def __init__(self, *args, **kwargs):
524
586
  super().__init__(
525
587
  *args,
526
588
  fixed_request_item="iPad mini",
527
- config_path=ORDER_IPAD_MINI_TASK_CONFIG_PATH,
528
589
  **kwargs,
529
590
  )
530
591
 
531
592
 
532
593
  class OrderIpadProTask(OrderHardwareTask):
594
+ config_path = ORDER_IPAD_PRO_TASK_CONFIG_PATH
595
+
533
596
  def __init__(self, *args, **kwargs):
534
597
  super().__init__(
535
598
  *args,
536
599
  fixed_request_item="iPad pro",
537
- config_path=ORDER_IPAD_PRO_TASK_CONFIG_PATH,
538
600
  **kwargs,
539
601
  )
540
602
 
541
603
 
542
604
  class OrderSalesLaptopTask(OrderHardwareTask):
605
+ config_path = ORDER_SALES_LAPTOP_TASK_CONFIG_PATH
606
+
543
607
  def __init__(self, *args, **kwargs):
544
608
  super().__init__(
545
609
  *args,
546
610
  fixed_request_item="Sales Laptop",
547
- config_path=ORDER_SALES_LAPTOP_TASK_CONFIG_PATH,
548
611
  **kwargs,
549
612
  )
550
613
 
551
614
 
552
615
  class OrderStandardLaptopTask(OrderHardwareTask):
616
+ config_path = ORDER_STANDARD_LAPTOP_TASK_CONFIG_PATH
617
+
553
618
  def __init__(self, *args, **kwargs):
554
619
  super().__init__(
555
620
  *args,
556
621
  fixed_request_item="Standard Laptop",
557
- config_path=ORDER_STANDARD_LAPTOP_TASK_CONFIG_PATH,
558
622
  **kwargs,
559
623
  )
560
624
 
561
625
 
562
626
  class OrderAppleWatchTask(OrderHardwareTask):
627
+ config_path = ORDER_APPLE_WATCH_TASK_CONFIG_PATH
628
+
563
629
  def __init__(self, *args, **kwargs):
564
630
  super().__init__(
565
631
  *args,
566
632
  fixed_request_item="Apple Watch",
567
- config_path=ORDER_APPLE_WATCH_TASK_CONFIG_PATH,
568
633
  **kwargs,
569
634
  )
570
635
 
571
636
 
572
637
  class OrderAppleMacBookPro15Task(OrderHardwareTask):
638
+ config_path = ORDER_APPLE_MAC_BOOK_PRO15_TASK_CONFIG_PATH
639
+
573
640
  def __init__(self, *args, **kwargs):
574
641
  super().__init__(
575
642
  *args,
576
643
  fixed_request_item="Apple MacBook Pro 15",
577
- config_path=ORDER_APPLE_MAC_BOOK_PRO15_TASK_CONFIG_PATH,
578
644
  **kwargs,
579
645
  )
580
646
 
581
647
 
582
648
  class OrderDevelopmentLaptopPCTask(OrderHardwareTask):
649
+ config_path = ORDER_DEVELOPMENT_LAPTOP_PC_TASK_CONFIG_PATH
650
+
583
651
  def __init__(self, *args, **kwargs):
584
652
  super().__init__(
585
653
  *args,
586
654
  fixed_request_item="Development Laptop (PC)",
587
- config_path=ORDER_DEVELOPMENT_LAPTOP_PC_TASK_CONFIG_PATH,
588
655
  **kwargs,
589
656
  )
590
657
 
591
658
 
592
659
  class OrderLoanerLaptopTask(OrderHardwareTask):
660
+ config_path = ORDER_LOANER_LAPTOP_TASK_CONFIG_PATH
661
+
593
662
  def __init__(self, *args, **kwargs):
594
663
  super().__init__(
595
664
  *args,
596
665
  fixed_request_item="Loaner Laptop",
597
- config_path=ORDER_LOANER_LAPTOP_TASK_CONFIG_PATH,
598
666
  **kwargs,
599
667
  )
600
668
 
@@ -18,9 +18,6 @@ def fill_text(page, input_field, value, iframe=None):
18
18
  The locator of the iframe that contains the input field, by default None
19
19
 
20
20
  """
21
- if value == "":
22
- return
23
-
24
21
  if iframe is None:
25
22
  iframe = page
26
23
 
@@ -28,7 +25,7 @@ def fill_text(page, input_field, value, iframe=None):
28
25
  input_field.click(force=True)
29
26
 
30
27
  # If the field uses autocomplete, we need to wait for Ajax to finish (and expand the menu)
31
- if input_field.get_attribute("aria-autocomplete") == "list":
28
+ if input_field.get_attribute("aria-autocomplete") == "list" and value != "":
32
29
  # Fill in the value using a procedure that triggers the autocomplete
33
30
  input_field.fill(value[:-1])
34
31
  page.keyboard.press(value[-1])
@@ -0,0 +1,63 @@
1
+ import json
2
+ import time
3
+ from ...api.utils import table_api_call
4
+ from playwright.sync_api import Page
5
+
6
+
7
+ def create_private_task_and_get_sys_id(
8
+ instance,
9
+ page: Page,
10
+ private_task_id: str,
11
+ task_info: str,
12
+ short_description: str,
13
+ user_sys_id: str = None,
14
+ ) -> None:
15
+ """
16
+ Create a private task in the ServiceNow instance to store the task information. Used for level 3 tasks.
17
+ Sets the sys_id of the private task to the sys_id attribute of the task.
18
+ Returns the sys_id of the private task.
19
+ Parameters:
20
+ ----------
21
+ instance: SNowInstance
22
+ The instance to use.
23
+ page: Page
24
+ playwright page
25
+ private_task_id: str
26
+ ID of the private task to be created.
27
+ task_info: str
28
+ The information needed to complete the task, written in the private task description.
29
+ short_description: str
30
+ A short description of the task, written in the private task short description.
31
+ user_sys_id: str
32
+ The sys_id of the user to assign the task to. If None, the task will be assigned to the admin user.
33
+ """
34
+ page.wait_for_load_state("networkidle")
35
+ if user_sys_id is None:
36
+ # Get the user sys_id; if the page is blank, use the admin user
37
+ if page.url == "about:blank":
38
+ user_sys_id = table_api_call(
39
+ instance=instance,
40
+ table="sys_user",
41
+ params={"sysparm_query": "user_name=admin"},
42
+ )["result"][0]["sys_id"]
43
+ else:
44
+ user_sys_id = page.evaluate("() => NOW.user.userID")
45
+ # Create private task containing the information needed to complete the task
46
+ result = table_api_call(
47
+ instance=instance,
48
+ table="vtb_task",
49
+ data=json.dumps(
50
+ {
51
+ "number": f"{private_task_id}",
52
+ "description": f"{task_info}",
53
+ "short_description": f"{short_description}",
54
+ "assigned_to": f"{user_sys_id}",
55
+ }
56
+ ),
57
+ method="POST",
58
+ )["result"]
59
+ sys_id = result["sys_id"]
60
+
61
+ assert result, "Failed to create private task"
62
+
63
+ return sys_id
@@ -18,3 +18,16 @@ def check_url_suffix_match(page: playwright.sync_api.Page, expected_url: str, ta
18
18
  logging.debug(f"Not in the expected URL for {task.__class__.__name__}, but in {page.url}")
19
19
  return False
20
20
  return True
21
+
22
+
23
+ def prettyprint_enum(items, conjunction="and"):
24
+ """
25
+ Pretty print a list of items with a conjunction
26
+
27
+ """
28
+ if not items:
29
+ return ""
30
+ elif len(items) == 1:
31
+ return items[0]
32
+ else:
33
+ return ", ".join(items[:-1]) + f", {conjunction} " + items[-1]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: browsergym-workarena
3
- Version: 0.2.1
3
+ Version: 0.3.1
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
@@ -15,7 +15,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
15
  Requires-Python: >3.7
16
16
  Requires-Dist: browsergym-core>=0.2
17
17
  Requires-Dist: english-words>=2.0.1
18
- Requires-Dist: faker>=24.11.0
18
+ Requires-Dist: faker>=24.8.0
19
19
  Requires-Dist: numpy>=1.14
20
20
  Requires-Dist: requests>=2.31
21
21
  Requires-Dist: tenacity>=8.2.3
@@ -34,12 +34,9 @@ WorkArena is included in [BrowserGym](https://github.com/ServiceNow/BrowserGym),
34
34
 
35
35
  https://github.com/ServiceNow/WorkArena/assets/2374980/68640f09-7d6f-4eb1-b556-c294a6afef70
36
36
 
37
- ## ⚠️ Pre-Release warning ⚠️
38
- Please note that the WorkArena benchmark is still undergoing minor bug fixes and updates, which may cause discrepancies with results reported in our latest arXiv preprint. We plan to release soon a stable version of WorkArena with enhanced stability, and a final version v1.0.0 with a new suite of tasks.
39
-
40
37
  ## Benchmark Contents
41
38
 
42
- At the moment, WorkArena includes `18,050` task instances drawn from `33` tasks that cover the main components of the ServiceNow user interface. The following videos show an agent built on `GPT-4-vision` interacting with every such component. As emphasized by our results, this benchmark is not solved and thus, the performance of the agent is not always on point.
39
+ At the moment, WorkArena includes `19,912` unique instances drawn from `33` tasks that cover the main components of the ServiceNow user interface. The following videos show an agent built on `GPT-4-vision` interacting with every such component. As emphasized by our results, this benchmark is not solved and thus, the performance of the agent is not always on point.
43
40
 
44
41
  ### Knowledge Bases
45
42
 
@@ -77,8 +74,11 @@ https://github.com/ServiceNow/WorkArena/assets/1726818/ca26dfaf-2358-4418-855f-8
77
74
 
78
75
  ### Dashboards
79
76
 
80
- **Goal:** The agent must extract information from a dashboard.
77
+ **Goal:** The agent must answer a question that requires reading charts and (optionally) performing simple reasoning over them.
78
+
79
+ *Note: For demonstration purposes, a human is controlling the cursor since this is a pure retrieval task*
81
80
 
81
+ https://github.com/ServiceNow/WorkArena/assets/1726818/0023232c-081f-4be4-99bd-f60c766e6c3f
82
82
 
83
83
 
84
84
  ## Getting Started
@@ -122,6 +122,8 @@ Your installation is now complete! 🎉
122
122
 
123
123
  Run this code to see WorkArena in action.
124
124
 
125
+ Note: the following example executes WorkArena's oracle (cheat) function to solve each task. To evaluate an agent, calls to `env.step()` must be used instead.
126
+
125
127
  ```python
126
128
  import random
127
129
 
@@ -136,28 +138,27 @@ for task in ALL_WORKARENA_TASKS:
136
138
 
137
139
  # Instantiate a new environment
138
140
  env = BrowserEnv(task_entrypoint=task,
139
- headless=False,
140
- slow_mo=1000)
141
+ headless=False)
141
142
  env.reset()
142
143
 
143
144
  # Cheat functions use Playwright to automatically solve the task
144
145
  env.chat.add_message(role="assistant", msg="On it. Please wait...")
145
- env.task.cheat(env.page, env.chat.messages)
146
+ cheat_messages = []
147
+ env.task.cheat(env.page, cheat_messages)
148
+
149
+ # Send cheat messages to chat
150
+ for cheat_msg in cheat_messages:
151
+ env.chat.add_message(role=cheat_msg["role"], msg=cheat_msg["message"])
146
152
 
147
153
  # Post solution to chat
148
- if "KnowledgeBaseSearchTask" in str(task):
149
- answer = env.chat.messages[-1]["message"]
150
- env.chat.add_message(role="assistant", msg=f"The answer is:")
151
- env.chat.add_message(role="assistant", msg=answer)
152
- else:
153
- env.chat.add_message(role="assistant", msg="I'm done!")
154
+ env.chat.add_message(role="assistant", msg="I'm done!")
154
155
 
155
156
  # Validate the solution
156
- reward, stop, info, message = env.task.validate(env.page, env.chat.messages)
157
+ reward, stop, message, info = env.task.validate(env.page, cheat_messages)
157
158
  if reward == 1:
158
159
  env.chat.add_message(role="user", msg="Yes, that works. Thanks!")
159
160
  else:
160
- env.chat.add_message(role="user", msg=f"No, that doesn't work. {message.get('message', '')}")
161
+ env.chat.add_message(role="user", msg=f"No, that doesn't work. {info.get('message', '')}")
161
162
 
162
163
  sleep(3)
163
164
  env.close()
@@ -0,0 +1,138 @@
1
+ browsergym/workarena/__init__.py,sha256=OP6OKzK3jaEKhZaa5dDvs1R_rWOdk2cziV9zjIaFvEc,1062
2
+ browsergym/workarena/config.py,sha256=tblmOUpqSoL3qlQHK_TFEDSFbC3o2kuRP_GFpoTNsX4,8522
3
+ browsergym/workarena/install.py,sha256=UaPE1K70xJB-2Gr1P5rJbcolkwMeWyRt04F7_5gpR4E,39341
4
+ browsergym/workarena/instance.py,sha256=Qw4lzHhgnl8IuiWOelsmzCJce3jXYivYYwtfTPt2H-s,4314
5
+ browsergym/workarena/utils.py,sha256=mD6RqVua-m1-mKM1RGGlUEu1s6un0ZI9a5ZTPN7g1hY,3199
6
+ browsergym/workarena/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ browsergym/workarena/api/category.py,sha256=4oiwPnRas0ZWCdky76zhNpu_9PfB_HmhnFa_DJZyGfA,2084
8
+ browsergym/workarena/api/change_request.py,sha256=9Z5uP23x08WuJao1na1tgM_B8DmYoB4vjiejhQomDCw,2493
9
+ browsergym/workarena/api/computer_asset.py,sha256=_-ZG_W2m9LbaoPHq1hQab2DEcmq_nfgEyUWMnxRcvEM,3247
10
+ browsergym/workarena/api/cost_center.py,sha256=8lFGQhKH1UDU2nwMYpA7Nqi2tHYw7o37hgMShsaNEsw,456
11
+ browsergym/workarena/api/expense_line.py,sha256=MfIsngynmuIXggDYsfXmo484bBVz3twNZNTvXDI4Q8k,2730
12
+ browsergym/workarena/api/incident.py,sha256=bVapse2cB9HyfgTuj-IMAJBMMPv7m9okRpzdpoloCn0,1147
13
+ browsergym/workarena/api/knowledge.py,sha256=lPvNDXwC9N9ZmOveqLVwR9B6tYj8DDonj2n3fu1AoDQ,983
14
+ browsergym/workarena/api/problem.py,sha256=QEr9uwUCOvVZcz7Or9bKkb7aCIrP7LSPulvfOLVyD1M,2647
15
+ browsergym/workarena/api/report.py,sha256=nNSTcM4mKE9GXjlm787iAlK5Q71oQbWdUcVvl0GlpeE,6903
16
+ browsergym/workarena/api/requested_items.py,sha256=g0X0sA1v8bAQzz9jfpATqSctUNNOTD547D6EH5Z4sw0,1678
17
+ browsergym/workarena/api/requests.py,sha256=z2vQTTkm1HR04_d_pce6jopuN--Oh0gUaT-YhrVa9-8,4148
18
+ browsergym/workarena/api/ui_themes.py,sha256=9H8HhnqHWt0CA5X5E1sokkXSCYYxtWZvhNFcXn3e90s,836
19
+ browsergym/workarena/api/user.py,sha256=mLx8r4RFVAuw66514xniv5sn_O4kwjAsVf-iCQC9aJk,4821
20
+ browsergym/workarena/api/utils.py,sha256=sulU1rC6jiCyDVwn5PqPK0AC-6m-GJS_4Crzar6pENU,5000
21
+ browsergym/workarena/data_files/setup_files/forms/expected_change_request_form_fields.json,sha256=UOf2NohzOZrjjkTLGMTluYHlIlDvMZY0pQRoJxJ3v6M,494
22
+ browsergym/workarena/data_files/setup_files/forms/expected_hardware_form_fields.json,sha256=Bl8_P8T3UXs0xTcyucvinFPHMq21OowsJQm_y-eunuY,768
23
+ browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json,sha256=9BvmeZN010BK9jc8bdizMf79tGgXc3xJPzN0iNrxUZA,467
24
+ browsergym/workarena/data_files/setup_files/forms/expected_problem_form_fields.json,sha256=IJjN7bynbU03Jq2xl5-Rf3anAcHpwnY3a3vQ3NbAkUo,614
25
+ browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json,sha256=Hf35GZwnk0Ew4t8q74OUiaJ_j8G06uWAM-DoDhvmpl4,219
26
+ browsergym/workarena/data_files/setup_files/forms/expected_user_form_fields.json,sha256=kBlWjNYSfHixMs7Ep9KZYc9eNKjKA1rSb090BeVplcI,317
27
+ browsergym/workarena/data_files/setup_files/knowledge/kb_autopublish_workflow.xml,sha256=zMSoA3lfg4-Fvs7egnR286CPzzDHoTk6ffKnODWrunM,11500
28
+ browsergym/workarena/data_files/setup_files/knowledge/knowledge_base.json,sha256=HHUH6ctyjea8R5oyhVCDedC__lGa_W9jaCGNfUVst50,474939
29
+ browsergym/workarena/data_files/setup_files/knowledge/protocols.json,sha256=aC2Tke_mwqbY3a1qrhlb7ISSngBNVUnKOOLZFdvzxQU,22448
30
+ browsergym/workarena/data_files/setup_files/knowledge/test.html,sha256=F0d_Y6NySX2lKzaw8Ifs4NlEDU5xgQCrtpvykqNnnOo,869
31
+ browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json,sha256=CaJzDGc9Cs7a3bOzGiVREoyvzA4jki61SILxQfyinWg,207
32
+ browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json,sha256=Ft1Cq-efYWM9F3ZvTQt45JExlYPKc6AYZoK6vPg3O2s,180
33
+ browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json,sha256=-9G42YD7Bv4ZxeD7vMCuFUgU9fl7f0A7O5MCQABke4Q,160
34
+ browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json,sha256=JZpbaKsQkxyYGBLrQYPOpzNGoCWtvFpA9grETIjBbxE,199
35
+ browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json,sha256=c7kuwtRqdFLIGtXZNw5PK955NpCCxIgKfrX_r9-tO6Q,174
36
+ browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json,sha256=k0g6F4kbQ3whTsmgJG2vkQSj5cYPQj7icKVympLSIfg,184
37
+ browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json,sha256=WgtdgFZNUFsZpKi7BifrGSuqV9OatzkjQga1ihOXgLU,174
38
+ browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json,sha256=_uqz_cTSi1bZhu4-flVSFopPRX2dXgy3mNF9etyWaRY,198
39
+ browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json,sha256=YBPrzERcQUs5DY_6q3aTe6pvQUgaOgGZBcyfTEgMHhM,151
40
+ browsergym/workarena/data_files/setup_files/ui_themes/workarena_themes.xml,sha256=P0Tqm9TnmHTrgu2FBh-vWPviOHQa_ZkG2Z9-4iwPENY,1970309
41
+ browsergym/workarena/data_files/task_configs/all_menu.json,sha256=yZrem5x9h5syPoPWlQeT7uXcN2kmKYkLwJm_6WtBtj4,270425
42
+ browsergym/workarena/data_files/task_configs/create_change_request_task.json,sha256=LMxS2YiG8_eH0fhXBis1fyAXE_XYZPwMmMuD2QuzdDY,6306733
43
+ browsergym/workarena/data_files/task_configs/create_hardware_asset_task.json,sha256=koP4OC3ot1ic8ybjCp1fev8X0JxIy_giZ7CyLPdE4qI,4971385
44
+ browsergym/workarena/data_files/task_configs/create_incident_task.json,sha256=BRaM61NMsOs9lrw5n1oT1GsYll0-8HpxYmi-Ry-PpBU,5812616
45
+ browsergym/workarena/data_files/task_configs/create_problem_task.json,sha256=LhEDjkDFhKevNwREOV-j69C3PQbpsu_Plt2wGTKxwUQ,4994349
46
+ browsergym/workarena/data_files/task_configs/create_user_task.json,sha256=UQornONckg3oTi2mToTq-uziP0ZO48Xoj5xvHXHkEp8,3981025
47
+ browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json,sha256=8hLmWvw_k4ImhJSFXrKhHIIDNZAc0L7mJQ98_YfOXN0,11515
48
+ browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json,sha256=XKsntIZOjpnNQwg-OyFcrDZXyu-JUwF7ZgnXdujfKJc,102363
49
+ browsergym/workarena/data_files/task_configs/filter_asset_list_task.json,sha256=APTgs-p5CkBVmWO-EQ2O7Cpt9nvaqvQT5fztzWoE8dA,11882372
50
+ browsergym/workarena/data_files/task_configs/filter_change_request_list_task.json,sha256=kL7xiQxSfXZgwEZhrnj_oMV_W0wBLo3QVwb3dHUkv7k,12812288
51
+ browsergym/workarena/data_files/task_configs/filter_hardware_list_task.json,sha256=9e5vxd2uQNTjOCXGSRg2PfZAsc5aGR52jt3m1kbiLdQ,12785357
52
+ browsergym/workarena/data_files/task_configs/filter_incident_list_task.json,sha256=prBD3rQWeq2_PLeBIZ_stC7GRf4s4APXXRy_8bL4wbg,11773863
53
+ browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json,sha256=WB-s_2AsBIIxX4-FjFPtm1KoAU4yUmWANIv6RSiPaWc,9231787
54
+ browsergym/workarena/data_files/task_configs/filter_user_list_task.json,sha256=K_06lJZGLVd63hEo-pG6IRTdXFBdcMsFeo_ROaBGwfs,55965665
55
+ browsergym/workarena/data_files/task_configs/impersonation_users.json,sha256=EyaWuPP87LJtuy6_QXBW3-MNzxboLcoRLlS3jjPpCXA,13021
56
+ browsergym/workarena/data_files/task_configs/knowledge_base_configs.json,sha256=1-7AFvLR7v2RXcpKqDmbKGYHwRIOL0FtHjOv5mjBhtg,617853
57
+ browsergym/workarena/data_files/task_configs/order_apple_mac_book_pro15_task.json,sha256=uHUcHJP7YiIuP7_-L5dXopSouRNfWRWMUD57kHjquNw,1483
58
+ browsergym/workarena/data_files/task_configs/order_apple_watch_task.json,sha256=Fql1AGlrTB4ZQGDnC_Fu2XPtvsW1h1WbhoCKproHzLQ,1673
59
+ browsergym/workarena/data_files/task_configs/order_developer_laptop_task.json,sha256=e9De5TFNR6X_HTKDtIajtozrRygAVgu5PNTN3jxsxSs,610195
60
+ browsergym/workarena/data_files/task_configs/order_development_laptop_pc_task.json,sha256=Z0a7xJtLY_BLdpRKoDTW7CT8sdDB59ImxXoWcXt0EzQ,15666
61
+ browsergym/workarena/data_files/task_configs/order_ipad_mini_task.json,sha256=kcfz6Ep6HyNLix_wtM1ITQj-02azv7JinQC6xfn7GW8,27830
62
+ browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json,sha256=gR5G3BLioin4qOPNqq6R1XGtFBvDBLRT0TrqO6SHoO0,20828
63
+ browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json,sha256=g_BDRnvn5wm7rRcISdmT197-4MDe2QfsWmY5FnCG7Tc,183107
64
+ browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json,sha256=6IGZg5NE2pjrUeDyOajk3Z2F4TCjqBRLS9VPh7lEu5Q,707828
65
+ browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json,sha256=qSh8lM13RgQyaKAzNIwAM0B84iZvSOgY1FQEAGeawaA,516203
66
+ browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json,sha256=MnM4iuo9kIQLh2pswgxEhTc0RGWRWxJnMl7afXBiVIc,112107
67
+ browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json,sha256=wDPrRXaF8FtKAD3Y1zWnwsDYEEcbjf1rUkIa5en-gn4,327974
68
+ browsergym/workarena/data_files/task_configs/sort_asset_list_task.json,sha256=CxGupg15OFAT8z0ddieTJnIOQ1xHqCJJkqPgZI1sJNA,44721
69
+ browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json,sha256=dmYPzs86MGzD-j_h8bEiynH9LWdfm12a2Z5PkSJ7-dc,45862
70
+ browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json,sha256=iE5RmskNfiw-6CajMgmB75oxyJ8qu5JIjJugHf1NNPQ,45127
71
+ browsergym/workarena/data_files/task_configs/sort_incident_list_task.json,sha256=zh2GnqXM8BRj7C6vnIyrYD-Yo9rxe09rT4zXoCmveTA,45205
72
+ browsergym/workarena/data_files/task_configs/sort_service_catalog_item_list_task.json,sha256=c0tNR4c7nrOw922VER8vpG6KNuv62399bJBJ4rJcgC0,46700
73
+ browsergym/workarena/data_files/task_configs/sort_user_list_task.json,sha256=qcSQEtSjg0Fu4SeBMjjMukD7ndKkYFdiX4DBRDftqbU,44336
74
+ browsergym/workarena/human_eval/console.js,sha256=ilUtC0rpLojNcuxHDyELaCQ5H8SfR1oXmkP3o0pxDpo,7129
75
+ browsergym/workarena/human_eval/tool.py,sha256=SwPqArNnvEeOPLRgem6kwl8ho345o-1f3tOcPRA87U0,13113
76
+ browsergym/workarena/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ browsergym/workarena/tasks/base.py,sha256=Ikh_A5I9_9acHFQCcnVMEnlBg3u3QHQD2I_NbGvD6SE,6411
78
+ browsergym/workarena/tasks/comp_building_block.py,sha256=Lg3KbAWrxzAHe5XbPN6L8bvdu7mfJpmBvI7jXeSDwKE,194
79
+ browsergym/workarena/tasks/dashboard.py,sha256=c-C6Cl3YH4SMZr8IRFf3qFKvT-p8t80gub-5K3B9nHE,34038
80
+ browsergym/workarena/tasks/form.py,sha256=_s07yZ-zcZbi5v6VK6km1BPzUfIFfMEVWFm56QhoznM,64141
81
+ browsergym/workarena/tasks/knowledge.py,sha256=kANjlC7DpptMbRlUlZGdDjqZeWIwwyJzozV58qEA6KU,13751
82
+ browsergym/workarena/tasks/list.py,sha256=4Ov7fHD4smr_L_EB9og7j7pWTQ2zKAI8LWRrr-7ryiA,53389
83
+ browsergym/workarena/tasks/mark_duplicate_problem.py,sha256=2znPoyuC47hkIEz59jWR-KB2o4GKJ9z5K_C-mpBqBfE,7278
84
+ browsergym/workarena/tasks/navigation.py,sha256=Y80DpL8xBA8u9zSudW0W6Vf4qaRZUgW-jQO7pl6gOFs,8729
85
+ browsergym/workarena/tasks/send_chat_message.py,sha256=8yWSBEMDpv_reU4QH92rjtyPV6ZjhOAgby465Olc3jM,3854
86
+ browsergym/workarena/tasks/service_catalog.py,sha256=y-MxuJ-L3uJDB1RJz4cUpkoCN1F-Gc8q9HqzbOY_Cpg,25099
87
+ browsergym/workarena/tasks/compositional/__init__.py,sha256=zgbl23owwUZSnFD84rh-QJitaAsNCH0PNSct_H_NrM4,2341
88
+ browsergym/workarena/tasks/compositional/base.py,sha256=eIZhfpBOvZvrlC2X7PSbY_7JrILuezYe-NRzDTECHik,14578
89
+ browsergym/workarena/tasks/compositional/dash_do_base.py,sha256=ihxgwVxUfxBJXt49KzOSEH1i_8uymm1oMLGPrsD4zfI,58252
90
+ browsergym/workarena/tasks/compositional/dash_do_catalog.py,sha256=cB3LdFnb-msU-i-L4Cx05nILoUUGExBbsribxMQWhBI,35349
91
+ browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py,sha256=qHXsdtfsI3rCayX4jgaC-jZyWtFgKktX-nEQ-nvyFZ0,64121
92
+ browsergym/workarena/tasks/compositional/dash_do_create_incident.py,sha256=sqek6DspIe-cy0zlW7mE4hyKhY3_3AW3lJh44iQvw7E,17713
93
+ browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py,sha256=ccCcAMMlFvHqHvOd6ENNPnptDyK2itnmMdtb4oB9Y2U,11113
94
+ browsergym/workarena/tasks/compositional/dash_do_create_problem.py,sha256=cLWuwxBFXMOxKkmqQ8qp9PBQLfVWydqd1usg1-0wjMs,14237
95
+ browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py,sha256=XUmVt6f8zcJmS6NZ_D3ALfKlf021stJ6tja0LGkRYQY,9202
96
+ browsergym/workarena/tasks/compositional/dash_do_filter.py,sha256=SEUNDUBPVQo2ruki6x2ADhi3zUJoE7zXyxhzErkIdWI,62267
97
+ browsergym/workarena/tasks/compositional/dash_do_request_item.py,sha256=h3eH_T_m-lxl0f7stK1LPjeMlqUGeVrYb1yBqBuCh-U,45531
98
+ browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py,sha256=rzTHohm9x1OG8uC4A1wZc98sAvAd9vt7yu18BbIfLTI,23404
99
+ browsergym/workarena/tasks/compositional/delete_record.py,sha256=fXs_pdppZ60LA5ck6LgN3fJ3w9Z_MkmZMI6-AEI73Og,13164
100
+ browsergym/workarena/tasks/compositional/edit_knowledge_base.py,sha256=bKlcpfBNCsRyt-ktBQcvjn8Qpcx9Y8kaSPf1FeqxsPE,17262
101
+ browsergym/workarena/tasks/compositional/expense_management.py,sha256=99bpD0sXXDPGiN3EmNXUdijPjs-zcX-dHrwv5jCGSwA,21235
102
+ browsergym/workarena/tasks/compositional/filter_and_do.py,sha256=PHQqcBF0Y6V3fcmKIjXJ0Ar9STu5irXQvWpKFO2VXHE,5352
103
+ browsergym/workarena/tasks/compositional/find_and_order_item.py,sha256=4b4YmJQp29ON1SrQd9rznEbeQPtwqWXQAJfGrZrH5Vw,11316
104
+ browsergym/workarena/tasks/compositional/manage_change_request_schedule.py,sha256=U0o_le97mzjgvq5w3PUI7I4HrFosgEhdbwvMADuW1yY,46435
105
+ browsergym/workarena/tasks/compositional/mark_duplicate_problems.py,sha256=i3IUZg0ckfviv_Rg3KL2FcayxJ65rEgS7vbPcZJ5IZ0,16643
106
+ browsergym/workarena/tasks/compositional/maximize_investment_return.py,sha256=BziPkw8ynNzvDxUg6iKjh3eC3Zgi8X--jm7rTTKuoEA,54084
107
+ browsergym/workarena/tasks/compositional/navigate_and_do.py,sha256=ho4D_FBHzfE5DHaX_WVzI9qtx5lnSrFOKH_A47y3k9A,39492
108
+ browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py,sha256=w1rgYaWiShvpSSmX18S3fZcyEHhVl1xLKhgi-fOfLvc,76475
109
+ browsergym/workarena/tasks/compositional/offboard_user.py,sha256=h5CbUyZf9JyS2ya9B9RI_wfSiAuEmP4LcFmC6hh-fwc,7745
110
+ browsergym/workarena/tasks/compositional/onboard_user.py,sha256=Z2aPWnPjN0ujFcgi3iNY8PYb_RYV7JXUd7kUKDYM1PE,8882
111
+ browsergym/workarena/tasks/compositional/update_task.py,sha256=n1hlbWCWVwGgSE_aD5y4fVjy_mQtE5MsQZiPYMgGr4E,6170
112
+ browsergym/workarena/tasks/compositional/warranty_check.py,sha256=0ETl166zPqOZPvi4o1U9nvLGSb9rf2zQJoWWuM7ZUpk,8648
113
+ browsergym/workarena/tasks/compositional/work_assignment.py,sha256=zMFY4tGxxjQfzcC3YZf1OiwfTvUfkG1efU67o7ISGSs,32485
114
+ browsergym/workarena/tasks/compositional/workload_balancing.py,sha256=izMp4BCTQ5DH0P2WTv1ow4Rc-nqkPljTpRGXJHar7VE,16349
115
+ browsergym/workarena/tasks/compositional/utils/curriculum.py,sha256=ZlnPLinefvn4GPNv9zSDGJpgG0J4rpKH9LBALftmBzA,7434
116
+ browsergym/workarena/tasks/compositional/utils/infeasible_configs.py,sha256=iByO3kcj5TGrEyX-Q60ZoFQ2tZNI4WaSYNjvbCVY-y0,6027
117
+ browsergym/workarena/tasks/compositional/utils/knapsack.py,sha256=T5zBuJsphOmLwIz64imX7h5KlMxTrXPHcRAE32nv9Rk,9155
118
+ browsergym/workarena/tasks/scripts/README.md,sha256=-jOtGf9k2zoBhrBkesmfDnr9-s0PhOEi0KWI9xfOw1s,296
119
+ browsergym/workarena/tasks/scripts/extract_all_menu_items.py,sha256=vPxa5Y06RXiQC6YaR30B9ap_Zu34hTddxohLKqKmjzw,10044
120
+ browsergym/workarena/tasks/scripts/generate_dashboard_configs.py,sha256=r2cDLR1n1pnf5m_8XITNx93zuYt5JaBVaiut4OqYlkc,10063
121
+ browsergym/workarena/tasks/scripts/generate_forms.py,sha256=wnqXE1b5eQdwQB0ZqsqQS5z9VNKyObUnYoYVvsq4sM0,3695
122
+ browsergym/workarena/tasks/scripts/knowledge.py,sha256=Qrv3AY9i6vjXhitDFITGjNjMvOL6H7FLKCJR8hA6Qdo,1259
123
+ browsergym/workarena/tasks/scripts/list.py,sha256=Cy9pvUHqKRwSH5yWT746ZW9TMGZC9qrBzvPKZDGWYTM,4803
124
+ browsergym/workarena/tasks/scripts/navigation.py,sha256=2GIIGoW6Ad2YpwX99_MTuLoijSk-EgsjfRNiRaYaitE,853
125
+ browsergym/workarena/tasks/scripts/service_catalog.py,sha256=_jllQWEfiUidRgiX-hFbdrTRKmiufvQO4RJ558h8HuQ,4879
126
+ browsergym/workarena/tasks/scripts/validate.py,sha256=Q4SXNEtjSN8Pm6_Fz8ddOv5hbSaxclzii_Bm3dSHveE,7555
127
+ browsergym/workarena/tasks/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
+ browsergym/workarena/tasks/utils/debug.py,sha256=EEy7Rt2ETwkorPm0s6y_u0wutl5rDp_PVuM7BvnsbIA,670
129
+ browsergym/workarena/tasks/utils/form.py,sha256=gCdPQkfBneMK_x-w4ty7RrMqQK1o33uOzlgQcvX0icI,2499
130
+ browsergym/workarena/tasks/utils/js_utils.js,sha256=n97fmY2Jkr59rEcQSuSbCnn1L2ZNwM3Nrg-p4TAkdUU,5199
131
+ browsergym/workarena/tasks/utils/private_tasks.py,sha256=r7Z9SnBMuZdZ2i-tK6eULj0q8hclANXFSzdLl49KYHI,2128
132
+ browsergym/workarena/tasks/utils/string.py,sha256=ir5_ASD9QSFMZ9kuHo2snSXRuSfv_wROH6nxBLOTP4I,330
133
+ browsergym/workarena/tasks/utils/utils.py,sha256=xQD-njEwgN7qxfn1dLBN8MYfd3kl3TuVfpmI1yxML9k,955
134
+ browsergym_workarena-0.3.1.dist-info/METADATA,sha256=AkQsXf7XNV6KRmQHi4zErlG1ukK0iJoicWnFJytTAbU,7707
135
+ browsergym_workarena-0.3.1.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
136
+ browsergym_workarena-0.3.1.dist-info/entry_points.txt,sha256=1lCeAbQFCcU6UTFwS5QIA3TKhT2P9ZabaZKT7sIShKc,137
137
+ browsergym_workarena-0.3.1.dist-info/licenses/LICENSE,sha256=sZLFiZHo_1hcxXRhXUDnQYVATUuWwRCdQjBxqxNnNEs,579
138
+ browsergym_workarena-0.3.1.dist-info/RECORD,,
@@ -1,2 +1,3 @@
1
1
  [console_scripts]
2
+ workarena-human-eval = browsergym.workarena.human_eval.tool:main
2
3
  workarena-install = browsergym.workarena.install:main