inspect-ai 0.3.69__py3-none-any.whl → 0.3.71__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.
- inspect_ai/_cli/eval.py +27 -9
- inspect_ai/_display/core/display.py +2 -0
- inspect_ai/_display/core/footer.py +13 -3
- inspect_ai/_display/plain/display.py +6 -2
- inspect_ai/_display/rich/display.py +19 -6
- inspect_ai/_display/textual/app.py +9 -3
- inspect_ai/_display/textual/display.py +4 -0
- inspect_ai/_display/textual/widgets/samples.py +4 -10
- inspect_ai/_display/textual/widgets/transcript.py +35 -18
- inspect_ai/_eval/eval.py +14 -2
- inspect_ai/_eval/evalset.py +6 -1
- inspect_ai/_eval/run.py +6 -0
- inspect_ai/_eval/task/run.py +49 -23
- inspect_ai/_eval/task/task.py +26 -3
- inspect_ai/_util/content.py +20 -1
- inspect_ai/_util/interrupt.py +6 -0
- inspect_ai/_util/logger.py +19 -0
- inspect_ai/_util/rich.py +7 -8
- inspect_ai/_util/text.py +13 -0
- inspect_ai/_util/transcript.py +20 -6
- inspect_ai/_util/working.py +50 -0
- inspect_ai/_view/www/App.css +6 -0
- inspect_ai/_view/www/dist/assets/index.css +171 -99
- inspect_ai/_view/www/dist/assets/index.js +5972 -2770
- inspect_ai/_view/www/eslint.config.mjs +24 -1
- inspect_ai/_view/www/log-schema.json +619 -21
- inspect_ai/_view/www/package.json +8 -3
- inspect_ai/_view/www/src/App.tsx +2 -2
- inspect_ai/_view/www/src/appearance/icons.ts +3 -1
- inspect_ai/_view/www/src/components/AnsiDisplay.tsx +4 -3
- inspect_ai/_view/www/src/components/Card.tsx +9 -8
- inspect_ai/_view/www/src/components/DownloadButton.tsx +2 -1
- inspect_ai/_view/www/src/components/EmptyPanel.tsx +2 -2
- inspect_ai/_view/www/src/components/ErrorPanel.tsx +4 -3
- inspect_ai/_view/www/src/components/ExpandablePanel.tsx +13 -5
- inspect_ai/_view/www/src/components/FindBand.tsx +3 -3
- inspect_ai/_view/www/src/components/HumanBaselineView.tsx +3 -3
- inspect_ai/_view/www/src/components/LabeledValue.tsx +5 -4
- inspect_ai/_view/www/src/components/LargeModal.tsx +18 -13
- inspect_ai/_view/www/src/components/{LightboxCarousel.css → LightboxCarousel.module.css} +22 -18
- inspect_ai/_view/www/src/components/LightboxCarousel.tsx +36 -27
- inspect_ai/_view/www/src/components/MessageBand.tsx +2 -1
- inspect_ai/_view/www/src/components/NavPills.tsx +9 -8
- inspect_ai/_view/www/src/components/ProgressBar.tsx +2 -1
- inspect_ai/_view/www/src/components/TabSet.tsx +21 -15
- inspect_ai/_view/www/src/index.tsx +2 -2
- inspect_ai/_view/www/src/metadata/MetaDataGrid.tsx +11 -9
- inspect_ai/_view/www/src/metadata/MetaDataView.tsx +3 -2
- inspect_ai/_view/www/src/metadata/MetadataGrid.module.css +1 -0
- inspect_ai/_view/www/src/metadata/RenderedContent.tsx +16 -1
- inspect_ai/_view/www/src/plan/DatasetDetailView.tsx +3 -2
- inspect_ai/_view/www/src/plan/DetailStep.tsx +2 -1
- inspect_ai/_view/www/src/plan/PlanCard.tsx +2 -5
- inspect_ai/_view/www/src/plan/PlanDetailView.tsx +6 -9
- inspect_ai/_view/www/src/plan/ScorerDetailView.tsx +2 -1
- inspect_ai/_view/www/src/plan/SolverDetailView.tsx +3 -3
- inspect_ai/_view/www/src/samples/InlineSampleDisplay.tsx +2 -2
- inspect_ai/_view/www/src/samples/SampleDialog.tsx +3 -3
- inspect_ai/_view/www/src/samples/SampleDisplay.module.css +9 -1
- inspect_ai/_view/www/src/samples/SampleDisplay.tsx +30 -3
- inspect_ai/_view/www/src/samples/SampleSummaryView.module.css +4 -0
- inspect_ai/_view/www/src/samples/SampleSummaryView.tsx +25 -4
- inspect_ai/_view/www/src/samples/SamplesTools.tsx +2 -1
- inspect_ai/_view/www/src/samples/chat/ChatMessage.tsx +3 -19
- inspect_ai/_view/www/src/samples/chat/ChatMessageRenderer.tsx +2 -1
- inspect_ai/_view/www/src/samples/chat/ChatMessageRow.tsx +2 -1
- inspect_ai/_view/www/src/samples/chat/ChatView.tsx +2 -1
- inspect_ai/_view/www/src/samples/chat/ChatViewVirtualList.tsx +22 -7
- inspect_ai/_view/www/src/samples/chat/MessageContent.tsx +35 -6
- inspect_ai/_view/www/src/samples/chat/MessageContents.tsx +2 -2
- inspect_ai/_view/www/src/samples/chat/messages.ts +15 -2
- inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.tsx +13 -4
- inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +2 -2
- inspect_ai/_view/www/src/samples/chat/tools/ToolInput.tsx +18 -19
- inspect_ai/_view/www/src/samples/chat/tools/ToolOutput.module.css +1 -1
- inspect_ai/_view/www/src/samples/chat/tools/ToolOutput.tsx +4 -3
- inspect_ai/_view/www/src/samples/chat/tools/ToolTitle.tsx +2 -2
- inspect_ai/_view/www/src/samples/error/FlatSampleErrorView.tsx +2 -3
- inspect_ai/_view/www/src/samples/error/SampleErrorView.tsx +3 -2
- inspect_ai/_view/www/src/samples/list/SampleFooter.tsx +2 -1
- inspect_ai/_view/www/src/samples/list/SampleHeader.tsx +2 -1
- inspect_ai/_view/www/src/samples/list/SampleList.tsx +57 -45
- inspect_ai/_view/www/src/samples/list/SampleRow.tsx +2 -1
- inspect_ai/_view/www/src/samples/list/SampleSeparator.tsx +2 -1
- inspect_ai/_view/www/src/samples/sample-tools/EpochFilter.tsx +2 -2
- inspect_ai/_view/www/src/samples/sample-tools/SelectScorer.tsx +4 -3
- inspect_ai/_view/www/src/samples/sample-tools/SortFilter.tsx +2 -5
- inspect_ai/_view/www/src/samples/sample-tools/sample-filter/SampleFilter.tsx +2 -2
- inspect_ai/_view/www/src/samples/scores/SampleScoreView.tsx +2 -1
- inspect_ai/_view/www/src/samples/scores/SampleScores.tsx +2 -2
- inspect_ai/_view/www/src/samples/transcript/ApprovalEventView.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/ErrorEventView.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/InfoEventView.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/InputEventView.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/LoggerEventView.module.css +4 -0
- inspect_ai/_view/www/src/samples/transcript/LoggerEventView.tsx +12 -2
- inspect_ai/_view/www/src/samples/transcript/ModelEventView.module.css +1 -1
- inspect_ai/_view/www/src/samples/transcript/ModelEventView.tsx +25 -28
- inspect_ai/_view/www/src/samples/transcript/SampleInitEventView.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/SampleLimitEventView.tsx +9 -4
- inspect_ai/_view/www/src/samples/transcript/SampleTranscript.tsx +2 -2
- inspect_ai/_view/www/src/samples/transcript/SandboxEventView.module.css +32 -0
- inspect_ai/_view/www/src/samples/transcript/SandboxEventView.tsx +153 -0
- inspect_ai/_view/www/src/samples/transcript/ScoreEventView.tsx +2 -2
- inspect_ai/_view/www/src/samples/transcript/StepEventView.tsx +12 -5
- inspect_ai/_view/www/src/samples/transcript/SubtaskEventView.tsx +18 -14
- inspect_ai/_view/www/src/samples/transcript/ToolEventView.tsx +5 -5
- inspect_ai/_view/www/src/samples/transcript/TranscriptView.tsx +53 -16
- inspect_ai/_view/www/src/samples/transcript/event/EventNav.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/event/EventNavs.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/event/EventPanel.tsx +6 -3
- inspect_ai/_view/www/src/samples/transcript/event/EventRow.tsx +3 -2
- inspect_ai/_view/www/src/samples/transcript/event/EventSection.tsx +2 -2
- inspect_ai/_view/www/src/samples/transcript/event/EventTimingPanel.module.css +28 -0
- inspect_ai/_view/www/src/samples/transcript/event/EventTimingPanel.tsx +115 -0
- inspect_ai/_view/www/src/samples/transcript/event/utils.ts +29 -0
- inspect_ai/_view/www/src/samples/transcript/state/StateDiffView.tsx +2 -1
- inspect_ai/_view/www/src/samples/transcript/state/StateEventRenderers.tsx +3 -3
- inspect_ai/_view/www/src/samples/transcript/state/StateEventView.tsx +11 -8
- inspect_ai/_view/www/src/samples/transcript/types.ts +3 -1
- inspect_ai/_view/www/src/types/log.d.ts +312 -137
- inspect_ai/_view/www/src/usage/ModelTokenTable.tsx +6 -10
- inspect_ai/_view/www/src/usage/ModelUsagePanel.module.css +4 -0
- inspect_ai/_view/www/src/usage/ModelUsagePanel.tsx +32 -9
- inspect_ai/_view/www/src/usage/TokenTable.tsx +4 -6
- inspect_ai/_view/www/src/usage/UsageCard.tsx +2 -1
- inspect_ai/_view/www/src/utils/format.ts +8 -5
- inspect_ai/_view/www/src/utils/json.ts +24 -0
- inspect_ai/_view/www/src/workspace/WorkSpace.tsx +6 -5
- inspect_ai/_view/www/src/workspace/WorkSpaceView.tsx +18 -8
- inspect_ai/_view/www/src/workspace/error/TaskErrorPanel.tsx +2 -1
- inspect_ai/_view/www/src/workspace/navbar/Navbar.tsx +2 -1
- inspect_ai/_view/www/src/workspace/navbar/PrimaryBar.tsx +3 -3
- inspect_ai/_view/www/src/workspace/navbar/ResultsPanel.tsx +4 -3
- inspect_ai/_view/www/src/workspace/navbar/SecondaryBar.tsx +5 -4
- inspect_ai/_view/www/src/workspace/navbar/StatusPanel.tsx +5 -8
- inspect_ai/_view/www/src/workspace/sidebar/EvalStatus.tsx +5 -4
- inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +2 -1
- inspect_ai/_view/www/src/workspace/sidebar/Sidebar.tsx +2 -1
- inspect_ai/_view/www/src/workspace/sidebar/SidebarLogEntry.tsx +2 -2
- inspect_ai/_view/www/src/workspace/sidebar/SidebarScoreView.tsx +2 -1
- inspect_ai/_view/www/src/workspace/sidebar/SidebarScoresView.tsx +2 -2
- inspect_ai/_view/www/src/workspace/tabs/InfoTab.tsx +2 -2
- inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +2 -5
- inspect_ai/_view/www/src/workspace/tabs/SamplesTab.tsx +12 -11
- inspect_ai/_view/www/yarn.lock +241 -5
- inspect_ai/log/__init__.py +2 -0
- inspect_ai/log/_condense.py +4 -0
- inspect_ai/log/_log.py +72 -12
- inspect_ai/log/_recorders/eval.py +6 -1
- inspect_ai/log/_samples.py +5 -1
- inspect_ai/log/_transcript.py +89 -2
- inspect_ai/model/__init__.py +2 -0
- inspect_ai/model/_call_tools.py +8 -1
- inspect_ai/model/_chat_message.py +22 -7
- inspect_ai/model/_conversation.py +11 -9
- inspect_ai/model/_generate_config.py +25 -4
- inspect_ai/model/_model.py +164 -72
- inspect_ai/model/_model_call.py +10 -3
- inspect_ai/model/_model_output.py +3 -0
- inspect_ai/model/_openai.py +106 -40
- inspect_ai/model/_providers/anthropic.py +145 -26
- inspect_ai/model/_providers/bedrock.py +7 -0
- inspect_ai/model/_providers/cloudflare.py +20 -7
- inspect_ai/model/_providers/google.py +29 -8
- inspect_ai/model/_providers/groq.py +66 -27
- inspect_ai/model/_providers/hf.py +6 -0
- inspect_ai/model/_providers/mistral.py +78 -51
- inspect_ai/model/_providers/openai.py +66 -4
- inspect_ai/model/_providers/openai_o1.py +10 -0
- inspect_ai/model/_providers/providers.py +2 -2
- inspect_ai/model/_providers/util/tracker.py +92 -0
- inspect_ai/model/_providers/vllm.py +13 -5
- inspect_ai/model/_reasoning.py +15 -2
- inspect_ai/scorer/_model.py +23 -19
- inspect_ai/solver/_basic_agent.py +1 -3
- inspect_ai/solver/_bridge/patch.py +0 -2
- inspect_ai/solver/_human_agent/agent.py +14 -10
- inspect_ai/solver/_human_agent/commands/__init__.py +7 -3
- inspect_ai/solver/_human_agent/commands/submit.py +76 -30
- inspect_ai/solver/_limit.py +4 -4
- inspect_ai/solver/_plan.py +0 -3
- inspect_ai/solver/_task_state.py +7 -0
- inspect_ai/tool/__init__.py +2 -0
- inspect_ai/tool/_tool.py +3 -1
- inspect_ai/tool/_tools/_computer/_resources/tool/_run.py +1 -1
- inspect_ai/tool/_tools/_web_browser/_resources/.pylintrc +8 -0
- inspect_ai/tool/_tools/_web_browser/_resources/.vscode/launch.json +24 -0
- inspect_ai/tool/_tools/_web_browser/_resources/.vscode/settings.json +25 -0
- inspect_ai/tool/_tools/_web_browser/_resources/Dockerfile +5 -6
- inspect_ai/tool/_tools/_web_browser/_resources/README.md +10 -11
- inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree.py +71 -0
- inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree_node.py +323 -0
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/__init__.py +5 -0
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/a11y.py +279 -0
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom.py +9 -0
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom_snapshot.py +293 -0
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/page.py +94 -0
- inspect_ai/tool/_tools/_web_browser/_resources/constants.py +2 -0
- inspect_ai/tool/_tools/_web_browser/_resources/images/usage_diagram.svg +2 -0
- inspect_ai/tool/_tools/_web_browser/_resources/playwright_browser.py +50 -0
- inspect_ai/tool/_tools/_web_browser/_resources/playwright_crawler.py +31 -359
- inspect_ai/tool/_tools/_web_browser/_resources/playwright_page_crawler.py +280 -0
- inspect_ai/tool/_tools/_web_browser/_resources/pyproject.toml +65 -0
- inspect_ai/tool/_tools/_web_browser/_resources/rectangle.py +64 -0
- inspect_ai/tool/_tools/_web_browser/_resources/rpc_client_helpers.py +146 -0
- inspect_ai/tool/_tools/_web_browser/_resources/scale_factor.py +64 -0
- inspect_ai/tool/_tools/_web_browser/_resources/test_accessibility_tree_node.py +180 -0
- inspect_ai/tool/_tools/_web_browser/_resources/test_playwright_crawler.py +15 -9
- inspect_ai/tool/_tools/_web_browser/_resources/test_rectangle.py +15 -0
- inspect_ai/tool/_tools/_web_browser/_resources/test_web_client.py +44 -0
- inspect_ai/tool/_tools/_web_browser/_resources/web_browser_rpc_types.py +39 -0
- inspect_ai/tool/_tools/_web_browser/_resources/web_client.py +198 -48
- inspect_ai/tool/_tools/_web_browser/_resources/web_client_new_session.py +26 -25
- inspect_ai/tool/_tools/_web_browser/_resources/web_server.py +178 -39
- inspect_ai/tool/_tools/_web_browser/_web_browser.py +38 -19
- inspect_ai/tool/_tools/_web_search.py +3 -3
- inspect_ai/util/__init__.py +2 -1
- inspect_ai/util/_concurrency.py +14 -8
- inspect_ai/util/_display.py +12 -0
- inspect_ai/util/_sandbox/context.py +15 -0
- inspect_ai/util/_sandbox/docker/docker.py +7 -5
- inspect_ai/util/_sandbox/environment.py +32 -1
- inspect_ai/util/_sandbox/events.py +183 -0
- inspect_ai/util/_sandbox/local.py +3 -3
- inspect_ai/util/_sandbox/self_check.py +131 -43
- inspect_ai/util/_subtask.py +11 -0
- {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/METADATA +3 -3
- {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/RECORD +233 -211
- {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/WHEEL +1 -1
- inspect_ai/_view/www/src/components/VirtualList.module.css +0 -19
- inspect_ai/_view/www/src/components/VirtualList.tsx +0 -292
- inspect_ai/tool/_tools/_web_browser/_resources/accessibility_node.py +0 -312
- inspect_ai/tool/_tools/_web_browser/_resources/dm_env_servicer.py +0 -275
- inspect_ai/tool/_tools/_web_browser/_resources/images/usage_diagram.png +0 -0
- inspect_ai/tool/_tools/_web_browser/_resources/test_accessibility_node.py +0 -176
- inspect_ai/tool/_tools/_web_browser/_resources/test_dm_env_servicer.py +0 -135
- inspect_ai/tool/_tools/_web_browser/_resources/test_web_environment.py +0 -71
- inspect_ai/tool/_tools/_web_browser/_resources/web_environment.py +0 -184
- {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/LICENSE +0 -0
- {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/entry_points.txt +0 -0
- {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/top_level.txt +0 -0
@@ -1,184 +0,0 @@
|
|
1
|
-
"""A web dm_env (to be run in a docker container).
|
2
|
-
|
3
|
-
This environment allows the agent to interact with a web browser via text
|
4
|
-
commands.
|
5
|
-
"""
|
6
|
-
|
7
|
-
import functools
|
8
|
-
import json
|
9
|
-
import socket
|
10
|
-
import traceback
|
11
|
-
from typing import Any
|
12
|
-
|
13
|
-
import dm_env
|
14
|
-
import playwright_crawler
|
15
|
-
from dm_env import specs
|
16
|
-
|
17
|
-
|
18
|
-
class WebEnvironment(dm_env.Environment):
|
19
|
-
"""A DM environment where an agent controls a web browser."""
|
20
|
-
|
21
|
-
DEFAULT_OBSERVATIONS = ["web_url", "web_at", "error", "info"]
|
22
|
-
|
23
|
-
def __init__(self, browser_context):
|
24
|
-
"""Initializes the environment."""
|
25
|
-
super().__init__()
|
26
|
-
self._web: playwright_crawler.PlaywrightCrawler = (
|
27
|
-
playwright_crawler.PlaywrightCrawler(browser_context)
|
28
|
-
)
|
29
|
-
self._last_error = ""
|
30
|
-
self._hostname = socket.gethostname()
|
31
|
-
self._required_observations = self.DEFAULT_OBSERVATIONS
|
32
|
-
self._selected_node_id: str | None = None
|
33
|
-
|
34
|
-
def reset(self):
|
35
|
-
# We're not using reset at the moment
|
36
|
-
pass
|
37
|
-
|
38
|
-
def step(self, action: str) -> dm_env.TimeStep:
|
39
|
-
"""Updates the environment according to the action and returns a `TimeStep`.
|
40
|
-
|
41
|
-
Args:
|
42
|
-
action: the command to execute in the web environment.
|
43
|
-
|
44
|
-
Returns:
|
45
|
-
A `TimeStep` namedtuple containing:
|
46
|
-
step_type: A `StepType` value.
|
47
|
-
reward: always 0.
|
48
|
-
discount: always 1.
|
49
|
-
observation: the current web browser state rendered as text.
|
50
|
-
"""
|
51
|
-
# Process the incoming command.
|
52
|
-
# Commands are always in the form [COMMAND] [args]
|
53
|
-
command, *args = action.split(" ")
|
54
|
-
|
55
|
-
self._last_error = ""
|
56
|
-
self._selected_node_id = None
|
57
|
-
command_l = command.lower()
|
58
|
-
|
59
|
-
try:
|
60
|
-
if not command_l: # Equivalent to case '':
|
61
|
-
# Treat an empty command as a NOOP.
|
62
|
-
pass
|
63
|
-
elif command_l == "web_go" and len(args) > 0:
|
64
|
-
self._web.go_to_page(args[0])
|
65
|
-
elif command_l == "web_click" and len(args) > 0:
|
66
|
-
self._web.click(args[0])
|
67
|
-
elif command_l == "web_scroll" and len(args) > 0:
|
68
|
-
self._web.scroll(args[0])
|
69
|
-
elif command_l == "web_forward":
|
70
|
-
self._web.forward()
|
71
|
-
elif command_l == "web_back":
|
72
|
-
self._web.back()
|
73
|
-
elif command_l == "web_refresh":
|
74
|
-
self._web.refresh()
|
75
|
-
elif command_l == "web_type" and len(args) > 0:
|
76
|
-
self._web.type(args[0], " ".join(args[1:]))
|
77
|
-
elif command_l == "web_type_submit" and len(args) > 0:
|
78
|
-
# Clear any existing text, type the new text, and then press enter.
|
79
|
-
self._web.clear(args[0])
|
80
|
-
self._web.type(args[0], " ".join(args[1:]) + "\n")
|
81
|
-
else:
|
82
|
-
self._last_error = f'\n\nInvalid command: "{action}"'
|
83
|
-
|
84
|
-
except Exception as e:
|
85
|
-
# Broard exception as we don't know what kind of error the crawler might
|
86
|
-
# generate. If an error does occur pass it back as part of the
|
87
|
-
# observation.
|
88
|
-
traceback_info = traceback.extract_tb(e.__traceback__)[-1]
|
89
|
-
self._last_error = f"\nERROR:{e}\n{traceback_info}"
|
90
|
-
|
91
|
-
try:
|
92
|
-
# The update might fail due to async issues.
|
93
|
-
# TODO: Instead of a catch-all, make the webcrawler more
|
94
|
-
# robust dynamic or malformed elements.
|
95
|
-
self._web.update()
|
96
|
-
|
97
|
-
# If there's a cookies message click to sort it out.
|
98
|
-
self._auto_click_cookies()
|
99
|
-
|
100
|
-
except Exception as e: # pylint: disable=broad-exception-caught
|
101
|
-
traceback_info = traceback.extract_tb(e.__traceback__)[-1]
|
102
|
-
self._last_error = f"\nUPDATE ERROR:{e}\n{traceback_info}"
|
103
|
-
|
104
|
-
return dm_env.transition(
|
105
|
-
reward=0.0,
|
106
|
-
observation=self.get_observations(),
|
107
|
-
)
|
108
|
-
|
109
|
-
def observation_spec(self) -> dict[str, specs.Array]:
|
110
|
-
"""Defines the observations provided by the environment.
|
111
|
-
|
112
|
-
Returns:
|
113
|
-
The observation specification.
|
114
|
-
"""
|
115
|
-
obs_shapes = {
|
116
|
-
"web_url": specs.Array(shape=(), dtype=str, name="web_url"),
|
117
|
-
"web_at": specs.Array(shape=(), dtype=str, name="web_at"),
|
118
|
-
"error": specs.Array(shape=(), dtype=str, name="error"),
|
119
|
-
"info": specs.Array(shape=(), dtype=str, name="info"),
|
120
|
-
}
|
121
|
-
return {key: obs_shapes[key] for key in self._required_observations}
|
122
|
-
|
123
|
-
def action_spec(self) -> specs.Array:
|
124
|
-
"""Defines the actions that should be provided to `step`.
|
125
|
-
|
126
|
-
Returns:
|
127
|
-
The action specification.
|
128
|
-
"""
|
129
|
-
return specs.Array(shape=(), dtype=str, name="command")
|
130
|
-
|
131
|
-
def close(self) -> None:
|
132
|
-
"""Closes the environment."""
|
133
|
-
self._web.close()
|
134
|
-
|
135
|
-
@property
|
136
|
-
def info(self) -> dict[str, str]:
|
137
|
-
"""Returns a dictionary of information about this environment."""
|
138
|
-
out = {
|
139
|
-
"hostname": self._hostname,
|
140
|
-
}
|
141
|
-
if self._selected_node_id is not None:
|
142
|
-
out["node_id"] = self._selected_node_id
|
143
|
-
return out
|
144
|
-
|
145
|
-
def get_observations(
|
146
|
-
self, required_observations: list[str] | None = None
|
147
|
-
) -> dict[str, Any]:
|
148
|
-
"""Returns dictionary containing each requested observations.
|
149
|
-
|
150
|
-
Args:
|
151
|
-
required_observations: List of observations to include in the output. If
|
152
|
-
non-none overrides the default `self._requested_observations`.
|
153
|
-
"""
|
154
|
-
|
155
|
-
def render(mode):
|
156
|
-
return functools.partial(self._web.render, mode)
|
157
|
-
|
158
|
-
obs_map = {
|
159
|
-
"web_url": lambda: self._web.url.split("?")[0],
|
160
|
-
"web_at": render(playwright_crawler.CrawlerOutputFormat.AT),
|
161
|
-
"error": lambda: self._last_error,
|
162
|
-
"info": lambda: json.dumps(self.info),
|
163
|
-
}
|
164
|
-
|
165
|
-
result = {}
|
166
|
-
required_observations = (
|
167
|
-
self._required_observations
|
168
|
-
if required_observations is None
|
169
|
-
else required_observations
|
170
|
-
)
|
171
|
-
for obs_name in required_observations:
|
172
|
-
result[obs_name] = obs_map[obs_name]()
|
173
|
-
|
174
|
-
return result
|
175
|
-
|
176
|
-
def _auto_click_cookies(self):
|
177
|
-
"""Autoclick any cookies popup."""
|
178
|
-
try:
|
179
|
-
accept_node = self._web.lookup_node("<Accept all>")
|
180
|
-
self._web.click(accept_node.node_id)
|
181
|
-
self._web.update()
|
182
|
-
except ValueError:
|
183
|
-
# Node not found.
|
184
|
-
pass
|
File without changes
|
File without changes
|
File without changes
|