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.
- browsergym/workarena/__init__.py +13 -1
- browsergym/workarena/api/category.py +74 -0
- browsergym/workarena/api/change_request.py +87 -0
- browsergym/workarena/api/computer_asset.py +90 -0
- browsergym/workarena/api/cost_center.py +19 -0
- browsergym/workarena/api/expense_line.py +89 -0
- browsergym/workarena/api/incident.py +45 -0
- browsergym/workarena/api/knowledge.py +29 -0
- browsergym/workarena/api/problem.py +90 -0
- browsergym/workarena/api/report.py +183 -0
- browsergym/workarena/api/requested_items.py +63 -0
- browsergym/workarena/api/user.py +11 -8
- browsergym/workarena/api/utils.py +47 -3
- browsergym/workarena/config.py +21 -1
- browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +1 -1
- browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +1 -0
- browsergym/workarena/data_files/setup_files/knowledge/protocols.json +46 -0
- browsergym/workarena/data_files/setup_files/knowledge/test.html +1 -0
- browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +2 -24
- browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +4 -40
- browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +12 -0
- browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +1 -42
- browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +2 -18
- browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +12 -0
- browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +12 -0
- browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +2 -19
- browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +3 -50
- browsergym/workarena/data_files/task_configs/all_menu.json +1 -1
- browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +1 -1
- browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +1 -1
- browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +1 -1
- browsergym/workarena/data_files/task_configs/impersonation_users.json +1 -1
- browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +1 -1
- browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +1 -1
- browsergym/workarena/human_eval/console.js +176 -0
- browsergym/workarena/human_eval/tool.py +366 -0
- browsergym/workarena/install.py +81 -20
- browsergym/workarena/tasks/base.py +55 -20
- browsergym/workarena/tasks/comp_building_block.py +4 -0
- browsergym/workarena/tasks/compositional/__init__.py +76 -0
- browsergym/workarena/tasks/compositional/base.py +364 -0
- browsergym/workarena/tasks/compositional/dash_do_base.py +1366 -0
- browsergym/workarena/tasks/compositional/dash_do_catalog.py +1127 -0
- browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +2047 -0
- browsergym/workarena/tasks/compositional/dash_do_create_incident.py +403 -0
- browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +278 -0
- browsergym/workarena/tasks/compositional/dash_do_create_problem.py +336 -0
- browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +235 -0
- browsergym/workarena/tasks/compositional/dash_do_filter.py +1600 -0
- browsergym/workarena/tasks/compositional/dash_do_request_item.py +1315 -0
- browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +693 -0
- browsergym/workarena/tasks/compositional/delete_record.py +341 -0
- browsergym/workarena/tasks/compositional/edit_knowledge_base.py +457 -0
- browsergym/workarena/tasks/compositional/expense_management.py +598 -0
- browsergym/workarena/tasks/compositional/filter_and_do.py +139 -0
- browsergym/workarena/tasks/compositional/find_and_order_item.py +345 -0
- browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +1417 -0
- browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +499 -0
- browsergym/workarena/tasks/compositional/maximize_investment_return.py +1763 -0
- browsergym/workarena/tasks/compositional/navigate_and_do.py +1151 -0
- browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +2100 -0
- browsergym/workarena/tasks/compositional/offboard_user.py +207 -0
- browsergym/workarena/tasks/compositional/onboard_user.py +226 -0
- browsergym/workarena/tasks/compositional/update_task.py +145 -0
- browsergym/workarena/tasks/compositional/utils/curriculum.py +215 -0
- browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +151 -0
- browsergym/workarena/tasks/compositional/utils/knapsack.py +192 -0
- browsergym/workarena/tasks/compositional/warranty_check.py +227 -0
- browsergym/workarena/tasks/compositional/work_assignment.py +804 -0
- browsergym/workarena/tasks/compositional/workload_balancing.py +396 -0
- browsergym/workarena/tasks/dashboard.py +194 -12
- browsergym/workarena/tasks/form.py +1024 -232
- browsergym/workarena/tasks/knowledge.py +216 -25
- browsergym/workarena/tasks/list.py +519 -102
- browsergym/workarena/tasks/mark_duplicate_problem.py +171 -0
- browsergym/workarena/tasks/navigation.py +55 -13
- browsergym/workarena/tasks/scripts/extract_all_menu_items.py +9 -2
- browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +6 -5
- browsergym/workarena/tasks/scripts/service_catalog.py +2 -1
- browsergym/workarena/tasks/scripts/validate.py +8 -2
- browsergym/workarena/tasks/send_chat_message.py +90 -0
- browsergym/workarena/tasks/service_catalog.py +94 -26
- browsergym/workarena/tasks/utils/form.py +1 -4
- browsergym/workarena/tasks/utils/private_tasks.py +63 -0
- browsergym/workarena/tasks/utils/utils.py +13 -0
- {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/METADATA +19 -18
- browsergym_workarena-0.3.1.dist-info/RECORD +138 -0
- {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/entry_points.txt +1 -0
- browsergym_workarena-0.2.1.dist-info/RECORD +0 -85
- {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/WHEEL +0 -0
- {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": (
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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 =
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
self.
|
|
273
|
-
self.
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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 `
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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. {
|
|
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,,
|