inspect-ai 0.3.75__py3-none-any.whl → 0.3.76__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/_eval/evalset.py +3 -2
- inspect_ai/_eval/registry.py +3 -5
- inspect_ai/_eval/run.py +4 -0
- inspect_ai/_eval/task/run.py +4 -0
- inspect_ai/_util/logger.py +3 -0
- inspect_ai/_view/www/dist/assets/index.css +28 -16
- inspect_ai/_view/www/dist/assets/index.js +4801 -4615
- inspect_ai/_view/www/log-schema.json +79 -9
- inspect_ai/_view/www/src/samples/descriptor/score/CategoricalScoreDescriptor.tsx +1 -1
- inspect_ai/_view/www/src/samples/descriptor/score/NumericScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/samples/sample-tools/SortFilter.tsx +1 -1
- inspect_ai/_view/www/src/samples/transcript/ModelEventView.module.css +2 -2
- inspect_ai/_view/www/src/types/log.d.ts +11 -5
- inspect_ai/log/_recorders/json.py +8 -0
- inspect_ai/log/_transcript.py +13 -4
- inspect_ai/model/_call_tools.py +13 -4
- inspect_ai/model/_chat_message.py +3 -0
- inspect_ai/model/_model.py +5 -1
- inspect_ai/model/_model_output.py +6 -1
- inspect_ai/model/_openai.py +11 -6
- inspect_ai/model/_providers/anthropic.py +133 -75
- inspect_ai/model/_providers/openai.py +11 -8
- inspect_ai/model/_providers/vertex.py +5 -2
- inspect_ai/tool/__init__.py +4 -0
- inspect_ai/tool/_tool_call.py +5 -2
- inspect_ai/tool/_tool_support_helpers.py +200 -0
- inspect_ai/tool/_tools/_bash_session.py +119 -0
- inspect_ai/tool/_tools/_computer/_computer.py +1 -1
- inspect_ai/tool/_tools/_text_editor.py +121 -0
- inspect_ai/tool/_tools/_web_browser/_back_compat.py +150 -0
- inspect_ai/tool/_tools/_web_browser/_web_browser.py +75 -130
- inspect_ai/tool/_tools/_web_search.py +1 -1
- inspect_ai/util/_json.py +28 -0
- inspect_ai/util/_sandbox/context.py +16 -7
- inspect_ai/util/_sandbox/docker/config.py +1 -1
- inspect_ai/util/_sandbox/docker/internal.py +3 -3
- {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.76.dist-info}/METADATA +5 -2
- {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.76.dist-info}/RECORD +42 -68
- {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.76.dist-info}/WHEEL +1 -1
- inspect_ai/tool/_tools/_web_browser/_resources/.pylintrc +0 -8
- inspect_ai/tool/_tools/_web_browser/_resources/.vscode/launch.json +0 -24
- inspect_ai/tool/_tools/_web_browser/_resources/.vscode/settings.json +0 -25
- inspect_ai/tool/_tools/_web_browser/_resources/Dockerfile +0 -22
- inspect_ai/tool/_tools/_web_browser/_resources/README.md +0 -63
- inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree.py +0 -71
- inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree_node.py +0 -323
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/__init__.py +0 -5
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/a11y.py +0 -279
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom.py +0 -9
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom_snapshot.py +0 -293
- inspect_ai/tool/_tools/_web_browser/_resources/cdp/page.py +0 -94
- inspect_ai/tool/_tools/_web_browser/_resources/constants.py +0 -2
- inspect_ai/tool/_tools/_web_browser/_resources/images/usage_diagram.svg +0 -2
- inspect_ai/tool/_tools/_web_browser/_resources/mock_environment.py +0 -45
- inspect_ai/tool/_tools/_web_browser/_resources/playwright_browser.py +0 -50
- inspect_ai/tool/_tools/_web_browser/_resources/playwright_crawler.py +0 -48
- inspect_ai/tool/_tools/_web_browser/_resources/playwright_page_crawler.py +0 -280
- inspect_ai/tool/_tools/_web_browser/_resources/pyproject.toml +0 -65
- inspect_ai/tool/_tools/_web_browser/_resources/rectangle.py +0 -64
- inspect_ai/tool/_tools/_web_browser/_resources/rpc_client_helpers.py +0 -146
- inspect_ai/tool/_tools/_web_browser/_resources/scale_factor.py +0 -64
- inspect_ai/tool/_tools/_web_browser/_resources/test_accessibility_tree_node.py +0 -180
- inspect_ai/tool/_tools/_web_browser/_resources/test_playwright_crawler.py +0 -99
- inspect_ai/tool/_tools/_web_browser/_resources/test_rectangle.py +0 -15
- inspect_ai/tool/_tools/_web_browser/_resources/test_web_client.py +0 -44
- inspect_ai/tool/_tools/_web_browser/_resources/web_browser_rpc_types.py +0 -39
- inspect_ai/tool/_tools/_web_browser/_resources/web_client.py +0 -214
- inspect_ai/tool/_tools/_web_browser/_resources/web_client_new_session.py +0 -35
- inspect_ai/tool/_tools/_web_browser/_resources/web_server.py +0 -192
- {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.76.dist-info}/entry_points.txt +0 -0
- {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.76.dist-info/licenses}/LICENSE +0 -0
- {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.76.dist-info}/top_level.txt +0 -0
@@ -1,192 +0,0 @@
|
|
1
|
-
import threading
|
2
|
-
from typing import Awaitable, Callable, Unpack
|
3
|
-
|
4
|
-
from aiohttp.web import Application, Request, Response, run_app
|
5
|
-
from jsonrpcserver import Result, Success, async_dispatch, method
|
6
|
-
|
7
|
-
from constants import DEFAULT_SESSION_NAME, SERVER_PORT
|
8
|
-
from playwright_browser import PlaywrightBrowser
|
9
|
-
from playwright_crawler import PlaywrightCrawler
|
10
|
-
from scale_factor import get_screen_scale_factor
|
11
|
-
from web_browser_rpc_types import (
|
12
|
-
ClickArgs,
|
13
|
-
CrawlerBaseArgs,
|
14
|
-
CrawlerResponse,
|
15
|
-
GoArgs,
|
16
|
-
NewSessionArgs,
|
17
|
-
NewSessionResponse,
|
18
|
-
ScrollArgs,
|
19
|
-
TypeOrSubmitArgs,
|
20
|
-
)
|
21
|
-
|
22
|
-
|
23
|
-
class Sessions:
|
24
|
-
def __init__(self) -> None:
|
25
|
-
self._lock = threading.Lock()
|
26
|
-
self._browser: PlaywrightBrowser | None = None
|
27
|
-
self._sessions: dict[str, PlaywrightCrawler] = {}
|
28
|
-
|
29
|
-
async def new_session(self, headful: bool) -> str:
|
30
|
-
with self._lock:
|
31
|
-
if not self._browser:
|
32
|
-
self._browser = await PlaywrightBrowser.create(headless=not headful)
|
33
|
-
current_count = len(self._sessions)
|
34
|
-
name = (
|
35
|
-
DEFAULT_SESSION_NAME
|
36
|
-
if current_count == 0
|
37
|
-
else f"{DEFAULT_SESSION_NAME}_{current_count}"
|
38
|
-
)
|
39
|
-
crawler = await PlaywrightCrawler.create(
|
40
|
-
await self._browser.get_new_context(),
|
41
|
-
device_scale_factor=get_screen_scale_factor() if headful else 1,
|
42
|
-
)
|
43
|
-
self._sessions[name] = crawler
|
44
|
-
return name
|
45
|
-
|
46
|
-
async def get_crawler_for_session(self, name: str) -> PlaywrightCrawler:
|
47
|
-
if not self._sessions:
|
48
|
-
await self.new_session(False)
|
49
|
-
return self._sessions[name]
|
50
|
-
|
51
|
-
|
52
|
-
sessions = Sessions()
|
53
|
-
|
54
|
-
|
55
|
-
@method
|
56
|
-
async def new_session(**kwargs: Unpack[NewSessionArgs]) -> NewSessionResponse:
|
57
|
-
return Success(
|
58
|
-
NewSessionResponse(
|
59
|
-
session_name=await sessions.new_session(kwargs.get("headful", False))
|
60
|
-
).model_dump()
|
61
|
-
)
|
62
|
-
|
63
|
-
|
64
|
-
@method
|
65
|
-
async def web_go(**kwargs: Unpack[GoArgs]) -> Result:
|
66
|
-
async def handler(crawler: PlaywrightCrawler):
|
67
|
-
await (await crawler.current_page).go_to_url(kwargs["url"])
|
68
|
-
|
69
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
70
|
-
|
71
|
-
|
72
|
-
@method
|
73
|
-
async def web_click(**kwargs: Unpack[ClickArgs]) -> Result:
|
74
|
-
async def handler(crawler: PlaywrightCrawler):
|
75
|
-
await (await crawler.current_page).click(kwargs["element_id"])
|
76
|
-
|
77
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
78
|
-
|
79
|
-
|
80
|
-
@method
|
81
|
-
async def web_scroll(**kwargs: Unpack[ScrollArgs]) -> Result:
|
82
|
-
async def handler(crawler: PlaywrightCrawler):
|
83
|
-
await (await crawler.current_page).scroll(kwargs["direction"])
|
84
|
-
|
85
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
86
|
-
|
87
|
-
|
88
|
-
@method
|
89
|
-
async def web_forward(**kwargs: Unpack[CrawlerBaseArgs]) -> Result:
|
90
|
-
async def handler(crawler: PlaywrightCrawler):
|
91
|
-
await (await crawler.current_page).forward()
|
92
|
-
|
93
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
94
|
-
|
95
|
-
|
96
|
-
@method
|
97
|
-
async def web_back(**kwargs: Unpack[CrawlerBaseArgs]) -> Result:
|
98
|
-
async def handler(crawler: PlaywrightCrawler):
|
99
|
-
await (await crawler.current_page).back()
|
100
|
-
|
101
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
102
|
-
|
103
|
-
|
104
|
-
@method
|
105
|
-
async def web_refresh(**kwargs: Unpack[CrawlerBaseArgs]) -> Result:
|
106
|
-
async def handler(crawler: PlaywrightCrawler):
|
107
|
-
await (await crawler.current_page).refresh()
|
108
|
-
|
109
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
110
|
-
|
111
|
-
|
112
|
-
@method
|
113
|
-
async def web_type(**kwargs: Unpack[TypeOrSubmitArgs]) -> Result:
|
114
|
-
async def handler(crawler: PlaywrightCrawler):
|
115
|
-
await (await crawler.current_page).type(
|
116
|
-
kwargs["element_id"], _str_from_str_or_list(kwargs["text"])
|
117
|
-
)
|
118
|
-
|
119
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
120
|
-
|
121
|
-
|
122
|
-
@method
|
123
|
-
async def web_type_submit(**kwargs: Unpack[TypeOrSubmitArgs]) -> Result:
|
124
|
-
async def handler(crawler: PlaywrightCrawler):
|
125
|
-
await (await crawler.current_page).clear(kwargs["element_id"])
|
126
|
-
await (await crawler.current_page).type(
|
127
|
-
kwargs["element_id"], _str_from_str_or_list(kwargs["text"]) + "\n"
|
128
|
-
)
|
129
|
-
|
130
|
-
return await _execute_crawler_command(kwargs["session_name"], handler)
|
131
|
-
|
132
|
-
|
133
|
-
async def _execute_crawler_command(
|
134
|
-
session_name: str, handler: Callable[[PlaywrightCrawler], Awaitable[None]]
|
135
|
-
) -> Result:
|
136
|
-
if not sessions:
|
137
|
-
await new_session()
|
138
|
-
try:
|
139
|
-
crawler = await sessions.get_crawler_for_session(session_name)
|
140
|
-
await handler(crawler)
|
141
|
-
await (await crawler.current_page).update()
|
142
|
-
|
143
|
-
# If there's a cookies message click to sort it out.
|
144
|
-
await _auto_click_cookies(crawler)
|
145
|
-
|
146
|
-
return Success(
|
147
|
-
CrawlerResponse(
|
148
|
-
web_url=(await crawler.current_page).url.split("?")[0],
|
149
|
-
main_content=(await crawler.current_page).render_main_content(),
|
150
|
-
web_at=(await crawler.current_page).render_at(),
|
151
|
-
error=None,
|
152
|
-
).model_dump()
|
153
|
-
)
|
154
|
-
except Exception as e: # pylint: disable=broad-exception-caught
|
155
|
-
return Success(
|
156
|
-
CrawlerResponse(
|
157
|
-
web_url=(await crawler.current_page).url.split("?")[0],
|
158
|
-
web_at="encountered error",
|
159
|
-
error=str(e),
|
160
|
-
).model_dump()
|
161
|
-
)
|
162
|
-
|
163
|
-
|
164
|
-
def _str_from_str_or_list(str_or_list: str | list[str]) -> str:
|
165
|
-
return str_or_list if isinstance(str_or_list, str) else " ".join(str_or_list)
|
166
|
-
|
167
|
-
|
168
|
-
async def _auto_click_cookies(crawler: PlaywrightCrawler):
|
169
|
-
"""Autoclick any cookies popup."""
|
170
|
-
try:
|
171
|
-
accept_node = (await crawler.current_page).lookup_node("<Accept all>")
|
172
|
-
except LookupError:
|
173
|
-
return
|
174
|
-
await (await crawler.current_page).click(accept_node.node_id)
|
175
|
-
await (await crawler.current_page).update()
|
176
|
-
|
177
|
-
|
178
|
-
def main():
|
179
|
-
async def handle_request(request: Request) -> Response:
|
180
|
-
return Response(
|
181
|
-
text=await async_dispatch(await request.text()),
|
182
|
-
content_type="application/json",
|
183
|
-
)
|
184
|
-
|
185
|
-
app = Application()
|
186
|
-
app.router.add_post("/", handle_request)
|
187
|
-
|
188
|
-
run_app(app, port=SERVER_PORT)
|
189
|
-
|
190
|
-
|
191
|
-
if __name__ == "__main__":
|
192
|
-
main()
|
File without changes
|
File without changes
|
File without changes
|