inspect-ai 0.3.75__py3-none-any.whl → 0.3.77__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 (87) hide show
  1. inspect_ai/_cli/eval.py +16 -0
  2. inspect_ai/_display/core/results.py +6 -1
  3. inspect_ai/_eval/eval.py +8 -1
  4. inspect_ai/_eval/evalset.py +6 -2
  5. inspect_ai/_eval/registry.py +3 -5
  6. inspect_ai/_eval/run.py +7 -2
  7. inspect_ai/_eval/task/run.py +4 -0
  8. inspect_ai/_util/content.py +3 -0
  9. inspect_ai/_util/logger.py +3 -0
  10. inspect_ai/_view/www/dist/assets/index.css +28 -16
  11. inspect_ai/_view/www/dist/assets/index.js +4811 -4609
  12. inspect_ai/_view/www/log-schema.json +79 -9
  13. inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.tsx +22 -4
  14. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.tsx +1 -1
  15. inspect_ai/_view/www/src/samples/descriptor/score/CategoricalScoreDescriptor.tsx +1 -1
  16. inspect_ai/_view/www/src/samples/descriptor/score/NumericScoreDescriptor.tsx +2 -2
  17. inspect_ai/_view/www/src/samples/sample-tools/SortFilter.tsx +1 -1
  18. inspect_ai/_view/www/src/samples/transcript/ModelEventView.module.css +2 -2
  19. inspect_ai/_view/www/src/types/log.d.ts +11 -5
  20. inspect_ai/log/_recorders/json.py +8 -0
  21. inspect_ai/log/_transcript.py +13 -4
  22. inspect_ai/model/_call_tools.py +13 -4
  23. inspect_ai/model/_chat_message.py +3 -0
  24. inspect_ai/model/_model.py +5 -1
  25. inspect_ai/model/_model_output.py +6 -1
  26. inspect_ai/model/_openai.py +78 -10
  27. inspect_ai/model/_openai_responses.py +277 -0
  28. inspect_ai/model/_providers/anthropic.py +134 -75
  29. inspect_ai/model/_providers/azureai.py +2 -2
  30. inspect_ai/model/_providers/mistral.py +29 -13
  31. inspect_ai/model/_providers/openai.py +64 -57
  32. inspect_ai/model/_providers/openai_responses.py +177 -0
  33. inspect_ai/model/_providers/openrouter.py +52 -2
  34. inspect_ai/model/_providers/providers.py +1 -1
  35. inspect_ai/model/_providers/vertex.py +5 -2
  36. inspect_ai/tool/__init__.py +6 -0
  37. inspect_ai/tool/_tool.py +23 -3
  38. inspect_ai/tool/_tool_call.py +5 -2
  39. inspect_ai/tool/_tool_support_helpers.py +200 -0
  40. inspect_ai/tool/_tools/_bash_session.py +119 -0
  41. inspect_ai/tool/_tools/_computer/_computer.py +1 -1
  42. inspect_ai/tool/_tools/_text_editor.py +121 -0
  43. inspect_ai/tool/_tools/_think.py +48 -0
  44. inspect_ai/tool/_tools/_web_browser/_back_compat.py +150 -0
  45. inspect_ai/tool/_tools/_web_browser/_web_browser.py +75 -130
  46. inspect_ai/tool/_tools/_web_search.py +1 -1
  47. inspect_ai/util/_json.py +28 -0
  48. inspect_ai/util/_sandbox/context.py +16 -7
  49. inspect_ai/util/_sandbox/docker/config.py +1 -1
  50. inspect_ai/util/_sandbox/docker/internal.py +3 -3
  51. {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.77.dist-info}/METADATA +5 -2
  52. {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.77.dist-info}/RECORD +56 -80
  53. {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.77.dist-info}/WHEEL +1 -1
  54. inspect_ai/model/_image.py +0 -15
  55. inspect_ai/tool/_tools/_web_browser/_resources/.pylintrc +0 -8
  56. inspect_ai/tool/_tools/_web_browser/_resources/.vscode/launch.json +0 -24
  57. inspect_ai/tool/_tools/_web_browser/_resources/.vscode/settings.json +0 -25
  58. inspect_ai/tool/_tools/_web_browser/_resources/Dockerfile +0 -22
  59. inspect_ai/tool/_tools/_web_browser/_resources/README.md +0 -63
  60. inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree.py +0 -71
  61. inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree_node.py +0 -323
  62. inspect_ai/tool/_tools/_web_browser/_resources/cdp/__init__.py +0 -5
  63. inspect_ai/tool/_tools/_web_browser/_resources/cdp/a11y.py +0 -279
  64. inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom.py +0 -9
  65. inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom_snapshot.py +0 -293
  66. inspect_ai/tool/_tools/_web_browser/_resources/cdp/page.py +0 -94
  67. inspect_ai/tool/_tools/_web_browser/_resources/constants.py +0 -2
  68. inspect_ai/tool/_tools/_web_browser/_resources/images/usage_diagram.svg +0 -2
  69. inspect_ai/tool/_tools/_web_browser/_resources/mock_environment.py +0 -45
  70. inspect_ai/tool/_tools/_web_browser/_resources/playwright_browser.py +0 -50
  71. inspect_ai/tool/_tools/_web_browser/_resources/playwright_crawler.py +0 -48
  72. inspect_ai/tool/_tools/_web_browser/_resources/playwright_page_crawler.py +0 -280
  73. inspect_ai/tool/_tools/_web_browser/_resources/pyproject.toml +0 -65
  74. inspect_ai/tool/_tools/_web_browser/_resources/rectangle.py +0 -64
  75. inspect_ai/tool/_tools/_web_browser/_resources/rpc_client_helpers.py +0 -146
  76. inspect_ai/tool/_tools/_web_browser/_resources/scale_factor.py +0 -64
  77. inspect_ai/tool/_tools/_web_browser/_resources/test_accessibility_tree_node.py +0 -180
  78. inspect_ai/tool/_tools/_web_browser/_resources/test_playwright_crawler.py +0 -99
  79. inspect_ai/tool/_tools/_web_browser/_resources/test_rectangle.py +0 -15
  80. inspect_ai/tool/_tools/_web_browser/_resources/test_web_client.py +0 -44
  81. inspect_ai/tool/_tools/_web_browser/_resources/web_browser_rpc_types.py +0 -39
  82. inspect_ai/tool/_tools/_web_browser/_resources/web_client.py +0 -214
  83. inspect_ai/tool/_tools/_web_browser/_resources/web_client_new_session.py +0 -35
  84. inspect_ai/tool/_tools/_web_browser/_resources/web_server.py +0 -192
  85. {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.77.dist-info}/entry_points.txt +0 -0
  86. {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.77.dist-info/licenses}/LICENSE +0 -0
  87. {inspect_ai-0.3.75.dist-info → inspect_ai-0.3.77.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()