From f641e1b1a5bebff12937a6de50a8438409269f96 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Fri, 3 Jan 2025 13:02:11 -0500 Subject: [PATCH 01/41] SQUASHED & CHERRY PICKED from feature/anthropic-native-bash-tool --- examples/hello_computer.py | 37 ++++++++ src/inspect_ai/_cli/eval.py | 13 +++ src/inspect_ai/_view/www/log-schema.json | 15 +++ src/inspect_ai/_view/www/src/types/log.d.ts | 3 + src/inspect_ai/model/_generate_config.py | 6 ++ src/inspect_ai/model/_providers/anthropic.py | 96 ++++++++++++++++---- tools/vscode/src/@types/log.d.ts | 3 + 7 files changed, 154 insertions(+), 19 deletions(-) create mode 100644 examples/hello_computer.py diff --git a/examples/hello_computer.py b/examples/hello_computer.py new file mode 100644 index 000000000..670812115 --- /dev/null +++ b/examples/hello_computer.py @@ -0,0 +1,37 @@ +from inspect_ai import Task, task +from inspect_ai.dataset import Sample +from inspect_ai.solver import generate, use_tools +from inspect_ai.tool import tool + + +@tool +def computer(): + async def execute( + action: str, + text: str | None = None, + coordinate: list[int] | None = None, + ) -> str: + """Take an action using a computer. + + Args: + action: Action to take. + text: Text related to the action + coordinate: Coordinate related to the action. + + Returns: + The sound that was passed to check. + """ + return action + + return execute + + +@task +def hello_computer(): + return Task( + dataset=[Sample(input="Call the computer tool with the action 'screenshot'")], + solver=[ + use_tools([computer()]), + generate(), + ], + ) diff --git a/src/inspect_ai/_cli/eval.py b/src/inspect_ai/_cli/eval.py index c1f68c33c..0bf0f4e78 100644 --- a/src/inspect_ai/_cli/eval.py +++ b/src/inspect_ai/_cli/eval.py @@ -364,6 +364,14 @@ def eval_options(func: Callable[..., Any]) -> Callable[..., click.Context]: help="Whether to enable parallel function calling during tool use (defaults to True) OpenAI and Groq only.", envvar="INSPECT_EVAL_PARALLEL_TOOL_CALLS", ) + @click.option( + "--internal-tools/--no-internal-tools", + type=bool, + is_flag=True, + default=True, + help="Whether to automatically map tools to model internal implementations (e.g. 'computer' for anthropic).", + envvar="INSPECT_EVAL_INTERNAL_TOOLS", + ) @click.option( "--max-tool-output", type=int, @@ -438,6 +446,7 @@ def eval_command( logprobs: bool | None, top_logprobs: int | None, parallel_tool_calls: bool | None, + internal_tools: bool | None, max_tool_output: int | None, cache_prompt: str | None, reasoning_effort: str | None, @@ -597,6 +606,7 @@ def eval_set_command( logprobs: bool | None, top_logprobs: int | None, parallel_tool_calls: bool | None, + internal_tools: bool | None, max_tool_output: int | None, cache_prompt: str | None, reasoning_effort: str | None, @@ -835,6 +845,9 @@ def config_from_locals(locals: dict[str, Any]) -> GenerateConfigArgs: if key == "parallel_tool_calls": if value is not False: value = None + if key == "internal_tools": + if value is not False: + value = None config[key] = value # type: ignore return config diff --git a/src/inspect_ai/_view/www/log-schema.json b/src/inspect_ai/_view/www/log-schema.json index cb6c58beb..8c81c74e7 100644 --- a/src/inspect_ai/_view/www/log-schema.json +++ b/src/inspect_ai/_view/www/log-schema.json @@ -1065,6 +1065,7 @@ "logprobs": null, "top_logprobs": null, "parallel_tool_calls": null, + "internal_tools": null, "max_tool_output": null, "cache_prompt": null, "reasoning_effort": null @@ -2118,6 +2119,18 @@ "default": null, "title": "Parallel Tool Calls" }, + "internal_tools": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Internal Tools" + }, "max_tool_output": { "anyOf": [ { @@ -2186,6 +2199,7 @@ "logprobs", "top_logprobs", "parallel_tool_calls", + "internal_tools", "max_tool_output", "cache_prompt", "reasoning_effort" @@ -4123,6 +4137,7 @@ "best_of": null, "cache_prompt": null, "frequency_penalty": null, + "internal_tools": null, "logit_bias": null, "logprobs": null, "max_connections": null, diff --git a/src/inspect_ai/_view/www/src/types/log.d.ts b/src/inspect_ai/_view/www/src/types/log.d.ts index 7a8132c42..225b9c30f 100644 --- a/src/inspect_ai/_view/www/src/types/log.d.ts +++ b/src/inspect_ai/_view/www/src/types/log.d.ts @@ -77,6 +77,7 @@ export type NumChoices = number | null; export type Logprobs = boolean | null; export type TopLogprobs = number | null; export type ParallelToolCalls = boolean | null; +export type InternalTools = boolean | null; export type MaxToolOutput = number | null; export type CachePrompt = "auto" | boolean | null; export type ReasoningEffort = ("low" | "medium" | "high") | null; @@ -531,6 +532,7 @@ export interface GenerateConfig { logprobs: Logprobs; top_logprobs: TopLogprobs; parallel_tool_calls: ParallelToolCalls; + internal_tools: InternalTools; max_tool_output: MaxToolOutput; cache_prompt: CachePrompt; reasoning_effort: ReasoningEffort; @@ -873,6 +875,7 @@ export interface GenerateConfig1 { logprobs: Logprobs; top_logprobs: TopLogprobs; parallel_tool_calls: ParallelToolCalls; + internal_tools: InternalTools; max_tool_output: MaxToolOutput; cache_prompt: CachePrompt; reasoning_effort: ReasoningEffort; diff --git a/src/inspect_ai/model/_generate_config.py b/src/inspect_ai/model/_generate_config.py index a29cc8ce4..3e931afdd 100644 --- a/src/inspect_ai/model/_generate_config.py +++ b/src/inspect_ai/model/_generate_config.py @@ -66,6 +66,9 @@ class GenerateConfigArgs(TypedDict, total=False): parallel_tool_calls: bool | None """Whether to enable parallel function calling during tool use (defaults to True). OpenAI and Groq only.""" + internal_tools: bool | None + """Whether to automatically map tools to model internal implementations (e.g. 'computer' for anthropic).""" + max_tool_output: int | None """Maximum tool output (in bytes). Defaults to 16 * 1024.""" @@ -136,6 +139,9 @@ class GenerateConfig(BaseModel): parallel_tool_calls: bool | None = Field(default=None) """Whether to enable parallel function calling during tool use (defaults to True). OpenAI and Groq only.""" + internal_tools: bool | None = Field(default=None) + """Whether to automatically map tools to model internal implementations (e.g. 'computer' for anthropic).""" + max_tool_output: int | None = Field(default=None) """Maximum tool output (in bytes). Defaults to 16 * 1024.""" diff --git a/src/inspect_ai/model/_providers/anthropic.py b/src/inspect_ai/model/_providers/anthropic.py index 738031b51..5b9d696df 100644 --- a/src/inspect_ai/model/_providers/anthropic.py +++ b/src/inspect_ai/model/_providers/anthropic.py @@ -2,7 +2,7 @@ import os from copy import copy from logging import getLogger -from typing import Any, Literal, Tuple, cast +from typing import Any, Literal, NotRequired, Tuple, TypedDict, cast from anthropic import ( APIConnectionError, @@ -142,7 +142,7 @@ def model_call() -> ModelCall: system_param, tools_param, messages, - cache_prompt, + computer_use, ) = await resolve_chat_input(self.model_name, input, tools, config) # prepare request params (assembed this way so we can log the raw model call) @@ -158,13 +158,11 @@ def model_call() -> ModelCall: # additional options request = request | self.completion_params(config) - # caching header - if cache_prompt: - request["extra_headers"] = { - "anthropic-beta": "prompt-caching-2024-07-31" - } + # computer use beta + if computer_use: + request["extra_headers"] = {"anthropic-beta": "computer-use-2024-10-22"} - # call model + # make request message = await self.client.messages.create(**request, stream=False) # set response for ModelCall @@ -256,6 +254,9 @@ def handle_bad_request(self, ex: BadRequestError) -> ModelOutput | None: elif "content filtering" in error: content = "Sorry, but I am unable to help with that request." stop_reason = "content_filter" + else: + content = error + stop_reason = "unknown" if content and stop_reason: return ModelOutput.from_content( @@ -268,12 +269,26 @@ def handle_bad_request(self, ex: BadRequestError) -> ModelOutput | None: return None +# native anthropic tool definitions for computer use beta +# https://docs.anthropic.com/en/docs/build-with-claude/computer-use +class ComputerUseToolParam(TypedDict): + type: str + name: str + display_width_px: NotRequired[int] + display_height_px: NotRequired[int] + display_number: NotRequired[int] + + +# tools can be either a stock tool param or a special computer use tool param +ToolParamDef = ToolParam | ComputerUseToolParam + + async def resolve_chat_input( model: str, input: list[ChatMessage], tools: list[ToolInfo], config: GenerateConfig, -) -> Tuple[list[TextBlockParam] | None, list[ToolParam], list[MessageParam], bool]: +) -> Tuple[list[TextBlockParam] | None, list[ToolParamDef], list[MessageParam], bool]: # extract system message system_messages, messages = split_system_messages(input, config) @@ -286,14 +301,7 @@ async def resolve_chat_input( ) # tools - tools_params = [ - ToolParam( - name=tool.name, - description=tool.description, - input_schema=tool.parameters.model_dump(exclude_none=True), - ) - for tool in tools - ] + tools_params, computer_use = tool_params_for_tools(tools, config) # system messages if len(system_messages) > 0: @@ -343,10 +351,60 @@ async def resolve_chat_input( add_cache_control(cast(dict[str, Any], content[-1])) # return chat input - return system_param, tools_params, message_params, cache_prompt + return system_param, tools_params, message_params, computer_use + + +def tool_params_for_tools( + tools: list[ToolInfo], config: GenerateConfig +) -> tuple[list[ToolParamDef], bool]: + # tool params and computer_use bit to return + tool_params: list[ToolParamDef] = [] + computer_use = False + + # for each tool, check if it has a native computer use implementation and use that + # when available (noting that we need to set the computer use request header) + for tool in tools: + computer_use_tool = ( + computer_use_tool_param(tool) + if config.internal_tools is not False + else None + ) + if computer_use_tool: + tool_params.append(computer_use_tool) + computer_use = True + else: + tool_params.append( + ToolParam( + name=tool.name, + description=tool.description, + input_schema=tool.parameters.model_dump(exclude_none=True), + ) + ) + + return tool_params, computer_use + + +def computer_use_tool_param(tool: ToolInfo) -> ComputerUseToolParam | None: + # check for compatible 'computer' tool + if tool.name == "computer" and ( + sorted(tool.parameters.properties.keys()) + == sorted(["action", "coordinate", "text"]) + ): + return ComputerUseToolParam( + type="computer_20241022", + name="computer", + display_width_px=1024, + display_height_px=768, + display_number=1, + ) + # not a computer_use tool + else: + return None -def add_cache_control(param: TextBlockParam | ToolParam | dict[str, Any]) -> None: +def add_cache_control( + param: TextBlockParam | ToolParam | ComputerUseToolParam | dict[str, Any], +) -> None: cast(dict[str, Any], param)["cache_control"] = {"type": "ephemeral"} diff --git a/tools/vscode/src/@types/log.d.ts b/tools/vscode/src/@types/log.d.ts index 7a8132c42..225b9c30f 100644 --- a/tools/vscode/src/@types/log.d.ts +++ b/tools/vscode/src/@types/log.d.ts @@ -77,6 +77,7 @@ export type NumChoices = number | null; export type Logprobs = boolean | null; export type TopLogprobs = number | null; export type ParallelToolCalls = boolean | null; +export type InternalTools = boolean | null; export type MaxToolOutput = number | null; export type CachePrompt = "auto" | boolean | null; export type ReasoningEffort = ("low" | "medium" | "high") | null; @@ -531,6 +532,7 @@ export interface GenerateConfig { logprobs: Logprobs; top_logprobs: TopLogprobs; parallel_tool_calls: ParallelToolCalls; + internal_tools: InternalTools; max_tool_output: MaxToolOutput; cache_prompt: CachePrompt; reasoning_effort: ReasoningEffort; @@ -873,6 +875,7 @@ export interface GenerateConfig1 { logprobs: Logprobs; top_logprobs: TopLogprobs; parallel_tool_calls: ParallelToolCalls; + internal_tools: InternalTools; max_tool_output: MaxToolOutput; cache_prompt: CachePrompt; reasoning_effort: ReasoningEffort; From abc3cf64a384d085cfc209292e8a98c5e4ab502a Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Thu, 9 Jan 2025 07:32:39 -0500 Subject: [PATCH 02/41] FIX FOR feature/anthropic-native-bash-tool --- src/inspect_ai/model/_providers/anthropic.py | 21 +++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/inspect_ai/model/_providers/anthropic.py b/src/inspect_ai/model/_providers/anthropic.py index 5b9d696df..995eae8d9 100644 --- a/src/inspect_ai/model/_providers/anthropic.py +++ b/src/inspect_ai/model/_providers/anthropic.py @@ -1,8 +1,14 @@ import functools import os +import sys from copy import copy from logging import getLogger -from typing import Any, Literal, NotRequired, Tuple, TypedDict, cast +from typing import Any, Literal, Tuple, TypedDict, cast + +if sys.version_info >= (3, 11): + from typing import NotRequired +else: + from typing_extensions import NotRequired from anthropic import ( APIConnectionError, @@ -35,20 +41,11 @@ from inspect_ai._util.url import data_uri_mime_type, data_uri_to_base64, is_data_uri from inspect_ai.tool import ToolCall, ToolChoice, ToolFunction, ToolInfo -from .._chat_message import ( - ChatMessage, - ChatMessageAssistant, - ChatMessageSystem, -) +from .._chat_message import ChatMessage, ChatMessageAssistant, ChatMessageSystem from .._generate_config import GenerateConfig from .._model import ModelAPI from .._model_call import ModelCall -from .._model_output import ( - ChatCompletionChoice, - ModelOutput, - ModelUsage, - StopReason, -) +from .._model_output import ChatCompletionChoice, ModelOutput, ModelUsage, StopReason from .util import environment_prerequisite_error, model_base_url logger = getLogger(__name__) From 38414f5c94cc451ed5bc8ad33471ceb0f5f7751f Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 7 Jan 2025 21:17:23 -0500 Subject: [PATCH 03/41] Provisional implementation of computer tool. --- examples/computer/compose.yaml | 16 ++ examples/computer/computer.py | 58 ++++ examples/computer/flag.txt | 1 + examples/computer/moonWeight.ods | Bin 0 -> 9817 bytes examples/hello_computer.py | 37 --- examples/intervention/computer-compose.yaml | 7 + examples/intervention/intervention.py | 34 ++- src/inspect_ai/model/_model.py | 20 +- src/inspect_ai/tool/__init__.py | 2 + .../tool/_tools/_computer/__init__.py | 3 + .../tool/_tools/_computer/_common.py | 136 +++++++++ .../tool/_tools/_computer/_computer.py | 133 +++++++++ .../tool/_tools/_computer/_computer_split.py | 192 +++++++++++++ .../tool/_tools/_computer/_mock_logger.py | 44 +++ .../_tools/_computer/_resources/Dockerfile | 80 ++++++ .../_computer/_resources/build_image.sh | 5 + .../_resources/computer_tool/__init__.py | 0 .../_resources/computer_tool/_logger.py | 22 ++ .../_resources/computer_tool/_run.py | 42 +++ .../_resources/computer_tool/_tool_result.py | 33 +++ .../_resources/computer_tool/_x11_client.py | 260 ++++++++++++++++++ .../_resources/computer_tool/computer_tool.py | 85 ++++++ .../_resources/computer_tool/requirements.txt | 0 .../tint2/applications/firefox-custom.desktop | 8 + .../.config/tint2/applications/gedit.desktop | 8 + .../tint2/applications/terminal.desktop | 8 + .../image_home_dir/.config/tint2/tint2rc | 100 +++++++ .../_resources/image_home_dir/README.md | 28 ++ .../_resources/image_home_dir/entrypoint.sh | 11 + .../image_home_dir/mutter_startup.sh | 21 ++ .../image_home_dir/tint2_startup.sh | 24 ++ .../image_home_dir/x11vnc_startup.sh | 48 ++++ .../_resources/image_home_dir/xvfb_startup.sh | 48 ++++ .../_tools/_computer/_resources/run_image.sh | 9 + .../util/_sandbox/docker/internal.py | 4 +- 35 files changed, 1472 insertions(+), 55 deletions(-) create mode 100644 examples/computer/compose.yaml create mode 100644 examples/computer/computer.py create mode 100644 examples/computer/flag.txt create mode 100644 examples/computer/moonWeight.ods delete mode 100644 examples/hello_computer.py create mode 100644 examples/intervention/computer-compose.yaml create mode 100644 src/inspect_ai/tool/_tools/_computer/__init__.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_common.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_computer.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_computer_split.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_mock_logger.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/__init__.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_logger.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_run.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_tool_result.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/computer_tool.py create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/requirements.txt create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc create mode 100644 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/README.md create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/mutter_startup.sh create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/tint2_startup.sh create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/x11vnc_startup.sh create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/xvfb_startup.sh create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh diff --git a/examples/computer/compose.yaml b/examples/computer/compose.yaml new file mode 100644 index 000000000..e6e4f0fa7 --- /dev/null +++ b/examples/computer/compose.yaml @@ -0,0 +1,16 @@ +services: + default: + # Temporary internal image until the official one is available + image: inspect-computer-tool + init: true + + # If you only launch a single container, you can vnc into that container by using + # the following port mapping + # ports: + # - "5900:5900" + + # If you launch multiple containers, you can vnc into each container by using the + # following port mapping, but you will need to determine the host port number for + # the specific container by using `docker inspect ` + # ports: + # - "5900" diff --git a/examples/computer/computer.py b/examples/computer/computer.py new file mode 100644 index 000000000..c77b976c7 --- /dev/null +++ b/examples/computer/computer.py @@ -0,0 +1,58 @@ +from inspect_ai import Task, task +from inspect_ai.dataset import Sample +from inspect_ai.scorer import includes +from inspect_ai.solver import system_message +from inspect_ai.solver._basic_agent import basic_agent +from inspect_ai.tool import computer + +SYSTEM_MESSAGE = """ +Before each step, please clearly explain your intent for performing a tool action: "I expect tool command X to ...". + +After each step, carefully evaluate the resulting screenshot to see if the command achieved the right outcome. + +Explicitly show your thinking: "I have evaluated step X..." If not correct, try again. Only when +you confirm a step was executed correctly should you move on to the next one. + +Note that launching applications from the bottom task bar requires a single left click. +""" + + +@task +def computer_task(): + return Task( + dataset=[ + Sample( + input="Use the computer tool to find the contents of the file '/tmp/flag.txt'. When you've found it, report its contents.", + target="Frunobulax", + files={"/tmp/flag.txt": "flag.txt"}, + ), + Sample( + input="Use the computer tool and open the spreadsheet '/tmp/moonWeight.ods`. Enter your weight as 156 lbs. Report the result from cell B2. Important: If the 'Tip of the Day' dialog appears, you'll need to close it before proceeding. Important: You may need to install a spreadsheet using a command like 'sudo apt-get install -y libreoffice'.", + target="26", + files={"/tmp/moonWeight.ods": "moonWeight.ods"}, + ), + Sample( + input="Use the computer tool to launch a terminal. Type 'Trudging across the tundra. Mile after Mile.' into the terminal. Important: Make sure that the terminal window is active before typing. When you are done, please use the submit tool to record the result of hitting enter in the terminal after entering that text.", + target="bash: Trudging: command not found", + ), + Sample( + input="Use the computer tool to launch a calculator. Calculate 123 x 456. Report the result.", + target="56088", + ), + Sample( + input='Draw a smiley face with a paint program. When you are done, submit("Art is in the eye of the beholder"). Important: In XPaint, you need to create a new canvas before you can draw.', + target="Art is in the eye of the beholder", + ), + # Sample( + # input='Draw a smiley face with a paint program. The face should be a solid yellow circle on a light gray background with solid black circles for eyes. The mouth should be a curved black line. When you are done, submit("Art is in the eye of the beholder"). Important: In XPaint, you need to create a new canvas before you can draw. Also, in XPaint, the toolbar contains the following tools on each row. 1. Pencil, Dynamic Pencil, Dot Pencil 2. Brush, Spray, Smear 3. Segment, Polygonal Line, Arc 4. Arrowhead, Text, Erase 5. Box, Filled Box, Box Region 6. Oval, Filled Oval, Oval Region 7. Freehand Shape, Filled Freehand Shape, Freehand Shape Region 8. Polygon, Filled Polygon, Polygon Region 9. Spline Curve, Filled Spline Curve, Spline Curve Region 10. Fill, Gradient Fill, Fractal Fill', + # target='Art is in the eye of the beholder', + # ), + ], + solver=basic_agent( + init=system_message(SYSTEM_MESSAGE), + tools=[computer()], + max_messages=100, + ), + scorer=includes(), + sandbox="docker", + ) diff --git a/examples/computer/flag.txt b/examples/computer/flag.txt new file mode 100644 index 000000000..44d731cb9 --- /dev/null +++ b/examples/computer/flag.txt @@ -0,0 +1 @@ +Frunobulax diff --git a/examples/computer/moonWeight.ods b/examples/computer/moonWeight.ods new file mode 100644 index 0000000000000000000000000000000000000000..067bcace458611d2afd82b26f7aa0bf21649af70 GIT binary patch literal 9817 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 literal 0 HcmV?d00001 diff --git a/examples/hello_computer.py b/examples/hello_computer.py deleted file mode 100644 index 670812115..000000000 --- a/examples/hello_computer.py +++ /dev/null @@ -1,37 +0,0 @@ -from inspect_ai import Task, task -from inspect_ai.dataset import Sample -from inspect_ai.solver import generate, use_tools -from inspect_ai.tool import tool - - -@tool -def computer(): - async def execute( - action: str, - text: str | None = None, - coordinate: list[int] | None = None, - ) -> str: - """Take an action using a computer. - - Args: - action: Action to take. - text: Text related to the action - coordinate: Coordinate related to the action. - - Returns: - The sound that was passed to check. - """ - return action - - return execute - - -@task -def hello_computer(): - return Task( - dataset=[Sample(input="Call the computer tool with the action 'screenshot'")], - solver=[ - use_tools([computer()]), - generate(), - ], - ) diff --git a/examples/intervention/computer-compose.yaml b/examples/intervention/computer-compose.yaml new file mode 100644 index 000000000..fa375cfed --- /dev/null +++ b/examples/intervention/computer-compose.yaml @@ -0,0 +1,7 @@ +services: + default: + # Temporary internal image until the official one is available + image: inspect-computer-tool + init: true + ports: + - "5900:5900" diff --git a/examples/intervention/intervention.py b/examples/intervention/intervention.py index 07901ff77..fd710a118 100644 --- a/examples/intervention/intervention.py +++ b/examples/intervention/intervention.py @@ -1,4 +1,5 @@ from textwrap import dedent +from typing import Literal from rich.prompt import Prompt @@ -12,23 +13,36 @@ system_message, use_tools, ) -from inspect_ai.tool import bash, python +from inspect_ai.tool import bash, computer, python from inspect_ai.util import input_screen @task -def intervention(): - return Task( - solver=[ - system_prompt(), - user_prompt(), - use_tools([bash(), python()]), - agent_loop(), - ], - sandbox="docker", +def intervention(mode: Literal["basic", "computer"] = "basic") -> Task: + return ( + Task( + solver=[ + system_prompt(), + user_prompt(), + use_tools([bash(), python()]), + agent_loop(), + ], + sandbox="docker", + ) + if mode == "basic" + else Task( + solver=[ + system_prompt(), + user_prompt(), + use_tools([computer()]), + agent_loop(), + ], + sandbox=("docker", "computer-compose.yaml"), + ) ) +# TODO: Customize the prompt based on the mode above?? @solver def system_prompt(): SYSTEM_PROMPT = dedent(""" diff --git a/src/inspect_ai/model/_model.py b/src/inspect_ai/model/_model.py index 6b483cd1f..e92984fe1 100644 --- a/src/inspect_ai/model/_model.py +++ b/src/inspect_ai/model/_model.py @@ -165,7 +165,7 @@ def tools_required(self) -> bool: return False def tool_result_images(self) -> bool: - """Tool results can containe images""" + """Tool results can contain images""" return False @@ -713,16 +713,19 @@ def tool_result_images_reducer( messages: list[ChatMessage], message: ChatMessage, ) -> list[ChatMessage]: - # append the message - messages.append(message) - # if there are tool result images, pull them out into a ChatUserMessage if isinstance(message, ChatMessageTool) and isinstance(message.content, list): + tool_message = ChatMessageTool( + content=message.content.copy(), tool_call_id=message.tool_call_id + ) + assert isinstance(tool_message.content, list) + messages.append(tool_message) + user_content: list[Content] = [] - for i in range(0, len(message.content)): - if isinstance(message.content[i], ContentImage): + for i in range(0, len(tool_message.content)): + if isinstance(tool_message.content[i], ContentImage): user_content.append(message.content[i]) - message.content[i] = ContentText( + tool_message.content[i] = ContentText( text="Image content is in the message below." ) if len(user_content) > 0: @@ -730,6 +733,9 @@ def tool_result_images_reducer( ChatMessageUser(content=user_content, tool_call_id=message.tool_call_id) ) + else: + messages.append(message) + # return messages return messages diff --git a/src/inspect_ai/tool/__init__.py b/src/inspect_ai/tool/__init__.py index d53f76651..2bed7b432 100644 --- a/src/inspect_ai/tool/__init__.py +++ b/src/inspect_ai/tool/__init__.py @@ -14,6 +14,7 @@ from ._tool_info import ToolInfo from ._tool_params import ToolParam, ToolParams from ._tool_with import tool_with +from ._tools._computer import computer from ._tools._execute import bash, python from ._tools._web_browser import web_browser from ._tools._web_search import web_search @@ -23,6 +24,7 @@ "python", "web_browser", "web_search", + "computer", "tool", "tool_with", "Tool", diff --git a/src/inspect_ai/tool/_tools/_computer/__init__.py b/src/inspect_ai/tool/_tools/_computer/__init__.py new file mode 100644 index 000000000..908766c87 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/__init__.py @@ -0,0 +1,3 @@ +from ._computer import computer + +__all__ = ["computer"] diff --git a/src/inspect_ai/tool/_tools/_computer/_common.py b/src/inspect_ai/tool/_tools/_computer/_common.py new file mode 100644 index 000000000..78b458b34 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_common.py @@ -0,0 +1,136 @@ +import json +import logging +from typing import Literal + +from pydantic import BaseModel, Field + +from inspect_ai._util.content import ContentText +from inspect_ai.model import ContentImage +from inspect_ai.tool import ToolError, ToolResult +from inspect_ai.util import sandbox + +Action = Literal[ + "key", + "type", + "mouse_move", + "left_click", + "left_click_drag", + "right_click", + "middle_click", + "double_click", + "screenshot", + "cursor_position", +] + +log = logging.getLogger(__name__) +# log = MockLogger() +log.setLevel(logging.DEBUG) + + +class ToolExecResult(BaseModel): + output: str | None = Field(default=None) + error: str | None = Field(default=None) + base64_image: str | None = Field(default=None) + + +async def _send_cmd(cmdTail: list[str], timeout: int | None = None) -> ToolResult: + from inspect_ai.log._samples import sample_active + + sample = sample_active() + assert sample + sample_id = sample.sample.id + assert sample_id + + cmd = ["python3", "-m", "computer_tool.computer_tool", "--action"] + cmdTail + log.info(f"(sample={sample_id}) Executing command: {cmd}") + + try: + raw_exec_result = await sandbox().exec(cmd, timeout=timeout) + + if not raw_exec_result.success: + raise Exception( + f"Failure executing command: ${cmd} {raw_exec_result.stderr}" + ) + + result = ToolExecResult(**json.loads(raw_exec_result.stdout)) + + if result.error: + log.warning( + f"(sample={sample_id}) Tool returned an error. Raising ToolError('{result.error}'" + ) + raise ToolError(result.error) + + image = ( + ContentImage(image=f"data:image/png;base64,{result.base64_image}") + if result.base64_image + else None + ) + text = result.output if result.output and len(result.output) > 0 else None + + if text is not None and image is not None: + log.info( + f"(sample={sample_id}) ToolResult([ContentText('{text}'), ContentImage])" + ) + return [ContentText(text=text), image] + + if text is not None: + log.info(f"(sample={sample_id}) ToolResult('{text}')") + return text + + if image is not None: + log.info(f"(sample={sample_id}) ToolResult([ContentImage])") + return [image] + + log.warning( + "(sample={sample_id}) Tool returned neither output nor image - returning ToolResult('OK')" + ) + return "OK" + except ToolError: + raise + except Exception as e: + log.error(f"(sample={sample_id}) Sandbox.exec threw for {cmd}...re-raising {e}") + raise e + + +async def cursor_position(timeout: int | None = None) -> ToolResult: + return await _send_cmd(["cursor_position"], timeout=timeout) + + +async def screenshot(timeout: int | None = None) -> ToolResult: + return await _send_cmd(["screenshot"], timeout=timeout) + + +async def mouse_move(x: int, y: int, timeout: int | None = None) -> ToolResult: + return await _send_cmd( + ["mouse_move", "--coordinate", f"{x}", f"{y}"], timeout=timeout + ) + + +async def left_click(timeout: int | None = None) -> ToolResult: + return await _send_cmd(["left_click"], timeout=timeout) + + +async def left_click_drag(x: int, y: int, timeout: int | None = None) -> ToolResult: + return await _send_cmd( + ["left_click_drag", "--coordinate", f"{x}", f"{y}"], timeout=timeout + ) + + +async def right_click(timeout: int | None = None) -> ToolResult: + return await _send_cmd(["right_click"], timeout=timeout) + + +async def middle_click(timeout: int | None = None) -> ToolResult: + return await _send_cmd(["middle_click"], timeout=timeout) + + +async def double_click(timeout: int | None = None) -> ToolResult: + return await _send_cmd(["double_click"], timeout=timeout) + + +async def press_key(key: str, timeout: int | None = None) -> ToolResult: + return await _send_cmd(["key", "--text", key], timeout=timeout) + + +async def type(text: str, timeout: int | None = None) -> ToolResult: + return await _send_cmd(["type", "--text", text], timeout=timeout) diff --git a/src/inspect_ai/tool/_tools/_computer/_computer.py b/src/inspect_ai/tool/_tools/_computer/_computer.py new file mode 100644 index 000000000..96e9e1b73 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_computer.py @@ -0,0 +1,133 @@ +from typing import Awaitable, Callable + +from inspect_ai.tool import Tool, ToolError, ToolResult, tool +from inspect_ai.tool._tool import ToolParsingError + +from . import _common as common +from ._common import Action + +ActionFunction = Callable[[str], ToolResult | Awaitable[ToolResult]] + + +@tool() +def computer(timeout: int | None = None) -> Tool: + """ + Computer interaction tool. + + Args: + timeout (int | None): Timeout (in seconds) for command. + + Returns: + Computer interaction tool. + """ + + async def execute( + action: Action, + text: str | None = None, + coordinate: list[int] | None = None, + ) -> ToolResult: + """ + Use this tool to interact with a computer. + + Use a mouse and keyboard to interact with a computer's desktop GUI. + + Keep in mind that icons require double clicks to open while other UI affordances like menu items and buttons require a single click. + + Args: + action (Action): The action to perform. + - `key`: Press a key or key-combination on the keyboard. + - Example: execute(action="key", text="ctrl+s") + - Text can be any key name supported by xdotool's `key` such as: + "Return", "Escape", "alt+Tab", "BackSpace", "Tab", "alt+Tab", "ctrl+s", "Up", "KP_0" (for the numpad 0 key), + "Insert", "Delete", "Home", "End", "Prior", "Next", "Left", "Up", "Right", "Down", + "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + "Shift_L", "Shift_R", "Control_L", "Control_R", "Alt_L", "Alt_R", "Scroll_Lock", "Num_Lock", "Caps_Lock", "Pause", + "KP_Multiply", "KP_Home", "KP_Up", "KP_Prior", "KP_Subtract", "KP_Left", "KP_Begin", "KP_Right", "KP_Add", "KP_End","KP_Down", + "KP_Next", "KP_Insert", "KP_Delete", "KP_Enter", "KP_Divide", "KP_Equal", "KP_Decimal", + - `type`: Type a string of text on the keyboard. If the text contains spaces, enclose it in quotes. + - Example: execute(action="type", text="The crux of the biscuit is the apostrophe!") + - `cursor_position`: Get the current (x, y) pixel coordinate of the cursor on the screen. + - `mouse_move`: Move the cursor to a specified (x, y) pixel coordinate on the screen. + - Example: execute(action="mouse_move", coordinate=(100, 200)) + - `left_click`: Click the left mouse button. + - `left_click_drag`: Click and drag the cursor to a specified (x, y) pixel coordinate on the screen. + - Example: execute(action="left_click_drag", coordinate=(150, 250)) + - `right_click`: Click the right mouse button. + - `middle_click`: Click the middle mouse button. + - `double_click`: Double-click the left mouse button. + - `screenshot`: Take a screenshot. + text (str | None): The text to type or the key to press. Required when action is "key" or "type". + coordinate (tuple[int, int] | None): The (x, y) pixel coordinate on the screen to which to move or drag. Required when action is "mouse_move" or "left_click_drag". + + Returns: + The output of the command. Many commands will include a screenshot reflecting the result of the command in their output. + """ + try: + if action in ("mouse_move", "left_click_drag"): + if coordinate is None: + raise ToolParsingError(f"coordinate is required for {action}") + if text is not None: + raise ToolParsingError(f"text is not accepted for {action}") + if not isinstance(coordinate, list) or len(coordinate) != 2: + raise ToolParsingError(f"{coordinate} must be a tuple of length 2") + if not all(isinstance(i, int) and i >= 0 for i in coordinate): + raise ToolParsingError( + f"{coordinate} must be a tuple of non-negative ints" + ) + + if action == "mouse_move": + return await common.mouse_move( + coordinate[0], coordinate[1], timeout=timeout + ) + elif action == "left_click_drag": + return await common.left_click_drag( + coordinate[0], coordinate[1], timeout=timeout + ) + + if action in ("key", "type"): + if text is None: + raise ToolParsingError(f"text is required for {action}") + if coordinate is not None: + raise ToolParsingError(f"coordinate is not accepted for {action}") + if not isinstance(text, str): + raise ToolParsingError(output=f"{text} must be a string") + + if action == "key": + return await common.press_key(text, timeout=timeout) + elif action == "type": + return await common.type(text, timeout=timeout) + + if action in ( + "left_click", + "right_click", + "double_click", + "middle_click", + "screenshot", + "cursor_position", + ): + if text is not None: + raise ToolParsingError(f"text is not accepted for {action}") + if coordinate is not None: + raise ToolParsingError(f"coordinate is not accepted for {action}") + + if action == "screenshot": + return await common.screenshot(timeout=timeout) + elif action == "cursor_position": + return await common.cursor_position(timeout=timeout) + elif action == "left_click": + return await common.left_click(timeout=timeout) + elif action == "right_click": + return await common.right_click(timeout=timeout) + elif action == "middle_click": + return await common.middle_click(timeout=timeout) + elif action == "double_click": + return await common.double_click(timeout=timeout) + + raise ToolParsingError(f"Invalid action: {action}") + + except ToolError: + raise + except Exception as e: + raise ToolError(str(e)) + + return execute diff --git a/src/inspect_ai/tool/_tools/_computer/_computer_split.py b/src/inspect_ai/tool/_tools/_computer/_computer_split.py new file mode 100644 index 000000000..9c0eb5ed6 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_computer_split.py @@ -0,0 +1,192 @@ +from typing import Awaitable, Callable + +from inspect_ai.tool import Tool, ToolResult, tool + +from . import _common as common + +ActionFunction = Callable[[str], ToolResult | Awaitable[ToolResult]] + + +def computer_split(timeout: int | None = None) -> list[Tool]: + """ + Computer interaction tools. + + Args: + timeout (int | None): Timeout (in seconds) for command. + + Returns: + List of computer interaction tools. + """ + return [ + computer_cursor_position(), + computer_screenshot(), + computer_mouse_move(), + computer_left_click(), + computer_double_click(), + computer_left_click_drag(), + computer_right_click(), + computer_key(), + computer_type(), + ] + + +@tool() +def computer_cursor_position(timeout: int | None = None) -> Tool: + async def execute() -> ToolResult: + """ + Get the current (x, y) pixel coordinate of the cursor on the screen. + + Args: + None + + Returns: + A `str` of the form "x y" where x and y are the current mouse coordinates. + """ + return await common.cursor_position(timeout=timeout) + + return execute + + +@tool() +def computer_screenshot(timeout: int | None = None) -> Tool: + async def execute() -> ToolResult: + """ + Take a screenshot. + + Args: + None + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.screenshot(timeout=timeout) + + return execute + + +@tool() +def computer_mouse_move(timeout: int | None = None) -> Tool: + async def execute(x: int, y: int) -> ToolResult: + """ + Move the cursor to a specified (x, y) pixel coordinate on the screen. + + Args: + x: X coordinate of the mouse destination. + y: Y coordinate of the mouse destination. + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.mouse_move(x, y, timeout=timeout) + + return execute + + +@tool() +def computer_left_click(timeout: int | None = None) -> Tool: + async def execute() -> ToolResult: + """ + Click the left mouse button. + + Args: + None + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.left_click(timeout=timeout) + + return execute + + +@tool() +def computer_double_click(timeout: int | None = None) -> Tool: + async def execute() -> ToolResult: + """ + Double-click the left mouse button. + + Args: + None + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.double_click(timeout=timeout) + + return execute + + +@tool() +def computer_left_click_drag(timeout: int | None = None) -> Tool: + async def execute(x: int, y: int) -> ToolResult: + """ + Click and drag the cursor to a specified (x, y) pixel coordinate on the screen. + + Args: + x: X coordinate of the mouse destination. + y: Y coordinate of the mouse destination. + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.left_click_drag(x, y, timeout=timeout) + + return execute + + +@tool() +def computer_right_click(timeout: int | None = None) -> Tool: + async def execute() -> ToolResult: + """ + Click the right mouse button. + + Args: + None + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.right_click(timeout=timeout) + + return execute + + +# keysm list is from https://gist.github.com/rvaiya/be31f42049a4b5ad46666a8e120d9843 +@tool() +def computer_key(timeout: int | None = None) -> Tool: + async def execute(key: str) -> ToolResult: + """ + Press a key or key-combination on the keyboard. + + Args: + key: The key or key-combination to press. Can be any key name supported by xdotool's `key` such as: + "Return", "Escape", "alt+Tab", "BackSpace", "Tab", "alt+Tab", "ctrl+s", "Up", "KP_0" (for the numpad 0 key), + "Insert", "Delete", "Home", "End", "Prior", "Next", "Left", "Up", "Right", "Down", + "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + "Shift_L", "Shift_R", "Control_L", "Control_R", "Alt_L", "Alt_R", "Scroll_Lock", "Num_Lock", "Caps_Lock", "Pause", + "KP_Multiply", "KP_Home", "KP_Up", "KP_Prior", "KP_Subtract", "KP_Left", "KP_Begin", "KP_Right", "KP_Add", "KP_End","KP_Down", + "KP_Next", "KP_Insert", "KP_Delete", "KP_Enter", "KP_Divide", "KP_Equal", "KP_Decimal" + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.press_key(key, timeout=timeout) + + return execute + + +@tool() +def computer_type(timeout: int | None = None) -> Tool: + async def execute(text: str) -> ToolResult: + """ + Type a string of text on the keyboard. + + Args: + text: The text to type. If the text contains spaces, enclose it in quotes. + + Returns: + A `list` with a single `ContentImage` of the screen. + """ + return await common.type(text, timeout=timeout) + + return execute diff --git a/src/inspect_ai/tool/_tools/_computer/_mock_logger.py b/src/inspect_ai/tool/_tools/_computer/_mock_logger.py new file mode 100644 index 000000000..dc0c0ad17 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_mock_logger.py @@ -0,0 +1,44 @@ +""" +This module is a temporary solution that allows one to alter the log level of a specific child logger. + +As currently implemented, even there is no way to enable DEBUG level console logging for a child logger +without also enabling DEBUG level logging for the root logger. + +This should be resolved, but in the meantime, this module provides a workaround. +""" + +import logging + + +class MockLogger: + level = logging.INFO + + def debug(self, msg: str, *args: object, **kwargs: object) -> None: + if self.level <= logging.DEBUG: + print(f"DEBUG: {msg % args}") + + def info(self, msg: str, *args: object, **kwargs: object) -> None: + if self.level <= logging.INFO: + print(f"INFO: {msg % args}") + + def warning(self, msg: str, *args: object, **kwargs: object) -> None: + if self.level <= logging.WARNING: + print(f"WARNING: {msg % args}") + + def error(self, msg: str, *args: object, **kwargs: object) -> None: + if self.level <= logging.ERROR: + print(f"ERROR: {msg % args}") + + def critical(self, msg: str, *args: object, **kwargs: object) -> None: + if self.level <= logging.CRITICAL: + print(f"CRITICAL: {msg % args}") + + def exception(self, msg: str, *args: object, **kwargs: object) -> None: + print(f"EXCEPTION: {msg % args}") + if "exc_info" in kwargs and kwargs["exc_info"]: + import traceback + + traceback.print_exc() + + def setLevel(self, level: int) -> None: + self.level = level diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile new file mode 100644 index 000000000..c320dfef9 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -0,0 +1,80 @@ +FROM docker.io/ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV DEBIAN_PRIORITY=high + +RUN apt-get update && \ + apt-get -y upgrade && \ + apt-get -y install \ + # UI Requirements + # A virtual framebuffer for running GUI applications without a physical display. + xvfb \ + # A terminal emulator for X. + xterm \ + # A command-line tool for automating X11 applications (e.g., simulating keyboard/mouse inputs). + xdotool \ + # A command-line tool for taking screenshots. + scrot \ + # A suite for image manipulation. + imagemagick \ + sudo \ + # A lightweight window manager. + mutter \ + # A VNC server for sharing X11 desktops. + x11vnc \ + # Python reqs + python3 \ + python3-pip \ + # Network tools + # Provides networking tools like ifconfig, netstat, etc. + net-tools \ + # A versatile networking tool for debugging, port scanning, and more. + netcat \ + # Adds tools like add-apt-repository for managing PPAs. + software-properties-common && \ + # Add PPA repository for Firefox + sudo add-apt-repository ppa:mozillateam/ppa && \ + # Userland apps + sudo apt-get install -y --no-install-recommends \ + firefox-esr \ + # A lightweight PDF viewer. + xpdf \ + # A simple text editor. + gedit \ + # A simple image viewer. + xpaint \ + # A lightweight taskbar for graphical desktops. + tint2 \ + # A calculator application. + galculator \ + # A lightweight file manager. + pcmanfm && \ + apt-get clean + +# setup user +ENV USERNAME=computeruse +ENV HOME=/home/$USERNAME +RUN useradd -m -s /bin/bash -d $HOME $USERNAME +RUN echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers +USER computeruse +WORKDIR $HOME + +# only reinstall if requirements.txt changes +COPY computer_tool/requirements.txt /opt/computer_tool/requirements.txt +RUN cd /opt/computer_tool && pip3 install --no-cache-dir -r requirements.txt + +COPY --chown=$USERNAME:$USERNAME image_home_dir/ $HOME +COPY computer_tool/ /opt/computer_tool +# This is needed if we want to use relative imports in the tool source files. +ENV PYTHONPATH=/opt + +EXPOSE 5900 + +ARG DISPLAY_NUM=1 +ARG HEIGHT=768 +ARG WIDTH=1024 +ENV DISPLAY_NUM=$DISPLAY_NUM +ENV HEIGHT=$HEIGHT +ENV WIDTH=$WIDTH + +ENTRYPOINT [ "./entrypoint.sh" ] diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh b/src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh new file mode 100755 index 000000000..73a7db9d1 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build "$SCRIPT_DIR" -t epatey/inspect-computer-tool:local \ No newline at end of file diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/__init__.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_logger.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_logger.py new file mode 100644 index 000000000..c3a3a42fe --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_logger.py @@ -0,0 +1,22 @@ +import logging + + +def setup_logger(level=logging.INFO): + """ + This logger emits all of its output to PID 1's stdout. + + This makes it so that logging from invocations of the computer_tool cli show up in `docker logs` output. + """ + new_logger = logging.getLogger("computer_tool") + new_logger.setLevel(level) + + stdout_handler = logging.FileHandler("/proc/1/fd/1", mode="w") + stdout_handler.setLevel(level) + stdout_handler.setFormatter( + logging.Formatter("%(name)s(pid=%(process)d) - %(levelname)s - %(message)s") + ) + + if not new_logger.handlers: + new_logger.addHandler(stdout_handler) + + return new_logger diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_run.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_run.py new file mode 100644 index 000000000..89db980ac --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_run.py @@ -0,0 +1,42 @@ +"""Utility to run shell commands asynchronously with a timeout.""" + +import asyncio + +TRUNCATED_MESSAGE: str = "To save on context only part of this file has been shown to you. You should retry this tool after you have searched inside the file with `grep -n` in order to find the line numbers of what you are looking for." +MAX_RESPONSE_LEN: int = 16000 + + +def maybe_truncate(content: str, truncate_after: int | None = MAX_RESPONSE_LEN): + """Truncate content and append a notice if content exceeds the specified length.""" + return ( + content + if not truncate_after or len(content) <= truncate_after + else content[:truncate_after] + TRUNCATED_MESSAGE + ) + + +async def run( + cmd: str, + timeout: float | None = 120.0, # seconds + truncate_after: int | None = MAX_RESPONSE_LEN, +): + """Run a shell command asynchronously with a timeout.""" + process = await asyncio.create_subprocess_shell( + cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + + try: + stdout, stderr = await asyncio.wait_for(process.communicate(), timeout=timeout) + return ( + process.returncode or 0, + maybe_truncate(stdout.decode(), truncate_after=truncate_after), + maybe_truncate(stderr.decode(), truncate_after=truncate_after), + ) + except asyncio.TimeoutError as exc: + try: + process.kill() + except ProcessLookupError: + pass + raise TimeoutError( + f"Command '{cmd}' timed out after {timeout} seconds" + ) from exc diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_tool_result.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_tool_result.py new file mode 100644 index 000000000..138f85e4a --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_tool_result.py @@ -0,0 +1,33 @@ +from dataclasses import dataclass, fields, replace + + +@dataclass(kw_only=True, frozen=True) +class ToolResult: + """Represents the result of a tool execution.""" + + output: str | None = None + error: str | None = None + base64_image: str | None = None + + def __bool__(self): + return any(getattr(self, field.name) for field in fields(self)) + + def __add__(self, other: "ToolResult"): + def combine_fields( + field: str | None, other_field: str | None, concatenate: bool = True + ): + if field and other_field: + if concatenate: + return field + other_field + raise ValueError("Cannot combine tool results") + return field or other_field + + return ToolResult( + output=combine_fields(self.output, other.output), + error=combine_fields(self.error, other.error), + base64_image=combine_fields(self.base64_image, other.base64_image, False), + ) + + def replace(self, **kwargs): + """Returns a new ToolResult with the given fields replaced.""" + return replace(self, **kwargs) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py new file mode 100644 index 000000000..f632cedd2 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py @@ -0,0 +1,260 @@ +"""Based on https://github.com/anthropics/anthropic-quickstarts/blob/main/computer-use-demo/computer_use_demo/tools/computer.py""" + +import asyncio +import base64 +import logging +import os +import shlex +from pathlib import Path +from typing import Literal, TypedDict +from uuid import uuid4 + +from ._run import run +from ._tool_result import ToolResult + +OUTPUT_DIR = "/tmp/outputs" + +TYPING_DELAY_MS = 12 +TYPING_GROUP_SIZE = 50 + +ColorCount = Literal[4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4] + +Action = Literal[ + "key", + "type", + "mouse_move", + "left_click", + "left_click_drag", + "right_click", + "middle_click", + "double_click", + "screenshot", + "cursor_position", +] + + +class ToolError(Exception): + def __init__(self, message): + self.message = message + + +class Resolution(TypedDict): + width: int + height: int + + +# sizes above XGA/WXGA are not recommended (see README.md) +# scale down to one of these targets if ComputerTool._scaling_enabled is set +MAX_SCALING_TARGETS: dict[str, Resolution] = { + "XGA": Resolution(width=1024, height=768), # 4:3 + "WXGA": Resolution(width=1280, height=800), # 16:10 + "FWXGA": Resolution(width=1366, height=768), # ~16:9 +} + + +ScalingSource = Literal["computer", "api"] + + +class ComputerToolOptions(TypedDict): + display_height_px: int + display_width_px: int + display_number: int | None + + +def chunks(s: str, chunk_size: int) -> list[str]: + return [s[i : i + chunk_size] for i in range(0, len(s), chunk_size)] + + +class X11Client: + """ + A tool that allows the agent to interact with the screen, keyboard, and mouse of the current computer. + + The tool parameters are defined by Anthropic and are not editable. + """ + + width: int + height: int + display_num: int | None + # TODO: Complete plumbing this or remove it + color_count: ColorCount | None = 64 + + _screenshot_delay = 2.0 + _scaling_enabled = True + + @property + def options(self) -> ComputerToolOptions: + width, height = self.scale_coordinates("computer", self.width, self.height) + return { + "display_width_px": width, + "display_height_px": height, + "display_number": self.display_num, + } + + def __init__(self): + super().__init__() + + self.width = int(os.getenv("WIDTH") or 0) + self.height = int(os.getenv("HEIGHT") or 0) + assert self.width and self.height, "WIDTH, HEIGHT must be set" + if (display_num := os.getenv("DISPLAY_NUM")) is not None: + self.display_num = int(display_num) + self._display_prefix = f"DISPLAY=:{self.display_num} " + else: + self.display_num = None + self._display_prefix = "" + + self.xdotool = f"{self._display_prefix}xdotool" + + async def __call__( + self, + *, + action: Action, + text: str | None = None, + coordinate: tuple[int, int] | None = None, + **kwargs, + ): + if action in ("mouse_move", "left_click_drag"): + if coordinate is None: + raise ToolError(f"coordinate is required for {action}") + if text is not None: + raise ToolError(f"text is not accepted for {action}") + if not isinstance(coordinate, list) or len(coordinate) != 2: + raise ToolError(f"{coordinate} must be a tuple of length 2") + if not all(isinstance(i, int) and i >= 0 for i in coordinate): + raise ToolError(f"{coordinate} must be a tuple of non-negative ints") + + x, y = self.scale_coordinates("api", coordinate[0], coordinate[1]) + + if action == "mouse_move": + return await self.shell(f"{self.xdotool} mousemove --sync {x} {y}") + elif action == "left_click_drag": + return await self.shell( + f"{self.xdotool} mousedown 1 mousemove --sync {x} {y} mouseup 1" + ) + + if action in ("key", "type"): + if text is None: + raise ToolError(f"text is required for {action}") + if coordinate is not None: + raise ToolError(f"coordinate is not accepted for {action}") + if not isinstance(text, str): + raise ToolError(output=f"{text} must be a string") + + if action == "key": + return await self.shell(f"{self.xdotool} key -- {shlex.quote(text)}") + elif action == "type": + results: list[ToolResult] = [] + for chunk in chunks(text, TYPING_GROUP_SIZE): + cmd = f"{self.xdotool} type --delay {TYPING_DELAY_MS} -- {shlex.quote(chunk)}" + results.append(await self.shell(cmd, take_screenshot=False)) + + screenshot_base64 = await self.take_screenshot_after_delay() + return ToolResult( + output="".join(result.output or "" for result in results), + error="".join(result.error or "" for result in results), + base64_image=screenshot_base64, + ) + + if action in ( + "left_click", + "right_click", + "double_click", + "middle_click", + "screenshot", + "cursor_position", + ): + if text is not None: + raise ToolError(f"text is not accepted for {action}") + if coordinate is not None: + raise ToolError(f"coordinate is not accepted for {action}") + + if action == "screenshot": + return await self.screenshot() + elif action == "cursor_position": + result = await self.shell( + f"{self.xdotool} getmouselocation --shell", + take_screenshot=False, + ) + output = result.output or "" + x, y = self.scale_coordinates( + "computer", + int(output.split("X=")[1].split("\n")[0]), + int(output.split("Y=")[1].split("\n")[0]), + ) + return result.replace(output=f"X={x},Y={y}") + else: + click_arg = { + "left_click": "1", + "right_click": "3", + "middle_click": "2", + "double_click": "--repeat 2 --delay 500 1", + }[action] + return await self.shell(f"{self.xdotool} click {click_arg}") + + raise ToolError(f"Invalid action: {action}") + + async def screenshot(self): + """Take a screenshot of the current screen and return the base64 encoded image.""" + output_dir = Path(OUTPUT_DIR) + output_dir.mkdir(parents=True, exist_ok=True) + path = output_dir / f"screenshot_{uuid4().hex}.png" + + result = await self.shell( + f"{self._display_prefix}scrot --silent -p {path}", take_screenshot=False + ) + if self._scaling_enabled: + x, y = self.scale_coordinates("computer", self.width, self.height) + convert_cmd = f"convert {path} -resize {x}x{y}!" + if self.color_count is not None: + convert_cmd += f" -colors {self.color_count}" + convert_cmd += f" {path}" + await self.shell(convert_cmd, take_screenshot=False) + + if path.exists(): + return result.replace( + base64_image=base64.b64encode(path.read_bytes()).decode() + ) + raise ToolError(f"Failed to take screenshot: {result.error}") + + async def shell(self, command: str, take_screenshot=True) -> ToolResult: + """Run a shell command and return the output, error, and optionally a screenshot.""" + logging.debug(f"running shell command {command}") + _, stdout, stderr = await run(command) + logging.debug(f"shell command returned stdout: {stdout}, stderr: {stderr}") + return ToolResult( + output=stdout, + error=stderr, + base64_image=(await self.take_screenshot_after_delay()) + if take_screenshot + else None, + ) + + async def take_screenshot_after_delay(self) -> str: + # delay to let things settle before taking a screenshot + await asyncio.sleep(self._screenshot_delay) + return (await self.screenshot()).base64_image + + def scale_coordinates(self, source: ScalingSource, x: int, y: int): + """Scale coordinates to a target maximum resolution.""" + if not self._scaling_enabled: + return x, y + ratio = self.width / self.height + target_dimension = None + for dimension in MAX_SCALING_TARGETS.values(): + # allow some error in the aspect ratio - not ratios are exactly 16:9 + if abs(dimension["width"] / dimension["height"] - ratio) < 0.02: + if dimension["width"] < self.width: + target_dimension = dimension + break + if target_dimension is None: + return x, y + # should be less than 1 + x_scaling_factor = target_dimension["width"] / self.width + y_scaling_factor = target_dimension["height"] / self.height + if source == "api": + if x > self.width or y > self.height: + raise ToolError(f"Coordinates {x}, {y} are out of bounds") + # scale up + return round(x / x_scaling_factor), round(y / y_scaling_factor) + # scale down + return round(x * x_scaling_factor), round(y * y_scaling_factor) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/computer_tool.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/computer_tool.py new file mode 100644 index 000000000..1927d16c1 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/computer_tool.py @@ -0,0 +1,85 @@ +import argparse +import asyncio +import json +import logging +import os +import sys +import time + +from ._logger import setup_logger +from ._tool_result import ToolResult +from ._x11_client import X11Client + +# This is a bit sketchy. We really want to use relative imports here. Using absolute imports +# works at runtime, but it prevents intellisense from working. However, when this folder is +# copied to the container, by default relative imports won't work if this file is launched +# normally. To overcome this, two things need to happen: +# 1. PYTHONPATH must be set to the parent of the container folder. `PYTHONPATH=/opt` +# 2. The program must be launched with the -m flag. `python3 -m computer_tool.computer_tool` +# +# TODO: There's got to be a cleaner way. + +my_logger = setup_logger(logging.INFO) + + +def main(): + try: + args = parse_arguments() + my_logger.info(f"({args})") + result = asyncio.run(execute_action(args)) + + print( + json.dumps( + { + "output": result.output, + "error": result.error, + "base64_image": result.base64_image, + } + ) + ) + my_logger.debug("SUCCESS") + except Exception as e: + my_logger.warning(f"An error occurred: {e}") + print(f"An error occurred: {e}", file=sys.stderr) + sys.exit(1) + + +def parse_arguments(): + parser = argparse.ArgumentParser(description="Execute computer tool action") + parser.add_argument("--action", type=str, required=True, help="Action to perform") + parser.add_argument("--text", type=str, help="Optional text parameter") + parser.add_argument( + "--coordinate", + type=int, + nargs=2, + help="Optional coordinate parameter as a list of two integers", + ) + return parser.parse_args() + + +async def execute_action(args) -> ToolResult: + # we can't do anything until X11 is ready to go. + await wait_for_file("/tmp/mutter_started") + + computer = X11Client() + return await computer( + action=args.action, + text=args.text, + coordinate=args.coordinate if args.coordinate else None, + ) + + +async def wait_for_file(file_path, check_interval=1): + if os.path.exists(file_path): + return + my_logger.info(f"Waiting for {file_path}") + start_time = time.time() + while not os.path.exists(file_path): + await asyncio.sleep(check_interval) + my_logger.info( + f"Done waiting for {file_path} after {time.time() - start_time:.1f} seconds" + ) + + +if __name__ == "__main__": + main() diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/requirements.txt b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop new file mode 100755 index 000000000..948021262 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Firefox Custom +Comment=Open Firefox with custom URL +Exec=firefox-esr -new-window +Icon=firefox-esr +Terminal=false +Type=Application +Categories=Network;WebBrowser; diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop new file mode 100755 index 000000000..d5af03f40 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Gedit +Comment=Open gedit +Exec=gedit +Icon=text-editor-symbolic +Terminal=false +Type=Application +Categories=TextEditor; diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop new file mode 100644 index 000000000..0c2d45d4d --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Terminal +Comment=Open Terminal +Exec=xterm +Icon=utilities-terminal +Terminal=false +Type=Application +Categories=System;TerminalEmulator; diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc new file mode 100644 index 000000000..e62987609 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc @@ -0,0 +1,100 @@ +#------------------------------------- +# Panel +panel_items = TL +panel_size = 100% 60 +panel_margin = 0 0 +panel_padding = 2 0 2 +panel_background_id = 1 +wm_menu = 0 +panel_dock = 0 +panel_position = bottom center horizontal +panel_layer = top +panel_monitor = all +panel_shrink = 0 +autohide = 0 +autohide_show_timeout = 0 +autohide_hide_timeout = 0.5 +autohide_height = 2 +strut_policy = follow_size +panel_window_name = tint2 +disable_transparency = 1 +mouse_effects = 1 +font_shadow = 0 +mouse_hover_icon_asb = 100 0 10 +mouse_pressed_icon_asb = 100 0 0 +scale_relative_to_dpi = 0 +scale_relative_to_screen_height = 0 + +#------------------------------------- +# Taskbar +taskbar_mode = single_desktop +taskbar_hide_if_empty = 0 +taskbar_padding = 0 0 2 +taskbar_background_id = 0 +taskbar_active_background_id = 0 +taskbar_name = 1 +taskbar_hide_inactive_tasks = 0 +taskbar_hide_different_monitor = 0 +taskbar_hide_different_desktop = 0 +taskbar_always_show_all_desktop_tasks = 0 +taskbar_name_padding = 4 2 +taskbar_name_background_id = 0 +taskbar_name_active_background_id = 0 +taskbar_name_font_color = #e3e3e3 100 +taskbar_name_active_font_color = #ffffff 100 +taskbar_distribute_size = 0 +taskbar_sort_order = none +task_align = left + +#------------------------------------- +# Launcher +launcher_padding = 4 8 4 +launcher_background_id = 0 +launcher_icon_background_id = 0 +launcher_icon_size = 48 +launcher_icon_asb = 100 0 0 +launcher_icon_theme_override = 0 +startup_notifications = 1 +launcher_tooltip = 1 + +#------------------------------------- +# Launcher icon +launcher_item_app = /usr/share/applications/pcmanfm.desktop +launcher_item_app = /home/computeruse/.config/tint2/applications/terminal.desktop +launcher_item_app = /home/computeruse/.config/tint2/applications/firefox-custom.desktop +launcher_item_app = /usr/share/applications/xpaint.desktop +launcher_item_app = /usr/share/applications/xpdf.desktop +launcher_item_app = /home/computeruse/.config/tint2/applications/gedit.desktop +launcher_item_app = /usr/share/applications/galculator.desktop + +#------------------------------------- +# Background definitions +# ID 1 +rounded = 0 +border_width = 0 +background_color = #000000 60 +border_color = #000000 30 + +# ID 2 +rounded = 4 +border_width = 1 +background_color = #777777 20 +border_color = #777777 30 + +# ID 3 +rounded = 4 +border_width = 1 +background_color = #777777 20 +border_color = #ffffff 40 + +# ID 4 +rounded = 4 +border_width = 1 +background_color = #aa4400 100 +border_color = #aa7733 100 + +# ID 5 +rounded = 4 +border_width = 1 +background_color = #aaaa00 100 +border_color = #aaaa00 100 diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/README.md b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/README.md new file mode 100644 index 000000000..571a2a8f5 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/README.md @@ -0,0 +1,28 @@ +# About This Image + +This image is based heavily on the image from Anthropic's Computer Use Demo [here](https://github.com/anthropics/anthropic-quickstarts/tree/main/computer-use-demo/image). + +It has been adapted to launch only those tools required for the Inspect `computer_tool` to interact with the computer via X11 and `xdotool`. + +## Tools Launched + +1. **Xvfb (X Virtual Framebuffer)** + - **Script:** `xvfb_startup.sh` + - **Description:** Xvfb is a display server implementing the X11 display server protocol. It runs in memory and does not require a physical display. This is useful for running graphical applications in a headless environment. + +2. **tint2** + - **Script:** `tint2_startup.sh` + - **Description:** tint2 is a lightweight panel/taskbar. It provides a taskbar, system tray, and application launcher. It is highly configurable and is used to manage and display open applications. + +3. **Mutter** + - **Script:** `mutter_startup.sh` + - **Description:** Mutter is a window manager for the X Window System. It is used to manage windows and provide compositing effects. In this setup, it is used to replace the default window manager and provide a graphical environment. + +4. **x11vnc** + - **Script:** `x11vnc_startup.sh` + - **Description:** x11vnc is a VNC server that allows remote access to the X11 display. It enables users to connect to the virtual display environment from a remote machine using a VNC client. + +## `.config/tint2` Directory + +The `.config/tint2` directory contains configuration files for tint2. These files define the appearance and behavior of the tint2 panel, including the taskbar, system tray, and application launcher. You can customize the tint2 panel by modifying the configuration files in this directory. + diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh new file mode 100755 index 000000000..bd20dde4f --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +export DISPLAY=:${DISPLAY_NUM} +./xvfb_startup.sh +./tint2_startup.sh +./mutter_startup.sh +./x11vnc_startup.sh + +# Keep the container running +tail -f /dev/null diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/mutter_startup.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/mutter_startup.sh new file mode 100755 index 000000000..17c2795fc --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/mutter_startup.sh @@ -0,0 +1,21 @@ +echo "starting mutter" +XDG_SESSION_TYPE=x11 mutter --replace --sm-disable 2>/tmp/mutter_stderr.log & + +# Wait for tint2 window properties to appear +timeout=30 +while [ $timeout -gt 0 ]; do + if xdotool search --class "mutter" >/dev/null 2>&1; then + break + fi + sleep 1 + ((timeout--)) +done + +if [ $timeout -eq 0 ]; then + echo "mutter stderr output:" >&2 + cat /tmp/mutter_stderr.log >&2 + exit 1 +fi + +touch /tmp/mutter_started +rm /tmp/mutter_stderr.log diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/tint2_startup.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/tint2_startup.sh new file mode 100755 index 000000000..34f39a18b --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/tint2_startup.sh @@ -0,0 +1,24 @@ +#!/bin/bash +echo "starting tint2 on display :$DISPLAY_NUM ..." + +# Start tint2 and capture its stderr +tint2 -c $HOME/.config/tint2/tint2rc 2>/tmp/tint2_stderr.log & + +# Wait for tint2 window properties to appear +timeout=30 +while [ $timeout -gt 0 ]; do + if xdotool search --class "tint2" >/dev/null 2>&1; then + break + fi + sleep 1 + ((timeout--)) +done + +if [ $timeout -eq 0 ]; then + echo "tint2 stderr output:" >&2 + cat /tmp/tint2_stderr.log >&2 + exit 1 +fi + +# Remove the temporary stderr log file +rm /tmp/tint2_stderr.log diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/x11vnc_startup.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/x11vnc_startup.sh new file mode 100755 index 000000000..ccb2fa7a3 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/x11vnc_startup.sh @@ -0,0 +1,48 @@ +#!/bin/bash +echo "starting vnc" + +(x11vnc -display $DISPLAY \ + -forever \ + -shared \ + -wait 50 \ + -cursor most \ + -cursor arrow \ + -rfbport 5900 \ + -nopw \ + 2>/tmp/x11vnc_stderr.log) & + +x11vnc_pid=$! + +# Wait for x11vnc to start +timeout=10 +while [ $timeout -gt 0 ]; do + if netstat -tuln | grep -q ":5900 "; then + break + fi + sleep 1 + ((timeout--)) +done + +if [ $timeout -eq 0 ]; then + echo "x11vnc failed to start, stderr output:" >&2 + cat /tmp/x11vnc_stderr.log >&2 + exit 1 +fi + +: > /tmp/x11vnc_stderr.log + +# Monitor x11vnc process in the background +( + while true; do + if ! kill -0 $x11vnc_pid 2>/dev/null; then + echo "x11vnc process crashed, restarting..." >&2 + if [ -f /tmp/x11vnc_stderr.log ]; then + echo "x11vnc stderr output:" >&2 + cat /tmp/x11vnc_stderr.log >&2 + rm /tmp/x11vnc_stderr.log + fi + exec "$0" + fi + sleep 5 + done +) & diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/xvfb_startup.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/xvfb_startup.sh new file mode 100755 index 000000000..9b9ae5852 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/xvfb_startup.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -e # Exit on error + +DPI=96 +RES_AND_DEPTH=${WIDTH}x${HEIGHT}x24 + +# Function to check if Xvfb is already running +check_xvfb_running() { + if [ -e /tmp/.X${DISPLAY_NUM}-lock ]; then + return 0 # Xvfb is already running + else + return 1 # Xvfb is not running + fi +} + +# Function to check if Xvfb is ready +wait_for_xvfb() { + local timeout=10 + local start_time=$(date +%s) + while ! xdpyinfo >/dev/null 2>&1; do + if [ $(($(date +%s) - start_time)) -gt $timeout ]; then + echo "Xvfb failed to start within $timeout seconds" >&2 + return 1 + fi + sleep 0.1 + done + return 0 +} + +# Check if Xvfb is already running +if check_xvfb_running; then + echo "Xvfb is already running on display ${DISPLAY}" + exit 0 +fi + +# Start Xvfb +Xvfb $DISPLAY -ac -screen 0 $RES_AND_DEPTH -retro -dpi $DPI -nolisten tcp -nolisten unix & +XVFB_PID=$! + +# Wait for Xvfb to start +if wait_for_xvfb; then + echo "Xvfb started successfully on display ${DISPLAY}" + echo "Xvfb PID: $XVFB_PID" +else + echo "Xvfb failed to start" + kill $XVFB_PID + exit 1 +fi diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh b/src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh new file mode 100755 index 000000000..ce12223cb --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker run -d --rm \ + -v "$SCRIPT_DIR"/computer_tool_support:/home/computeruse/computer_tool_support/ \ + -p 5900:5900 \ + -p 6080:6080 \ + -it epatey/inspect-computer-tool:local \ No newline at end of file diff --git a/src/inspect_ai/util/_sandbox/docker/internal.py b/src/inspect_ai/util/_sandbox/docker/internal.py index 4a4108b86..6130b7916 100644 --- a/src/inspect_ai/util/_sandbox/docker/internal.py +++ b/src/inspect_ai/util/_sandbox/docker/internal.py @@ -6,13 +6,15 @@ INSPECT_WEB_BROWSER_IMAGE_DOCKERHUB = "aisiuk/inspect-web-browser-tool" INSPECT_WEB_BROWSER_IMAGE = "inspect_web_browser" +INSPECT_COMPUTER_IMAGE = "inspect-computer-tool" INTERNAL_IMAGES = { INSPECT_WEB_BROWSER_IMAGE: PKG_PATH / "tool" / "_tools" / "_web_browser" - / "_resources" + / "_resources", + INSPECT_COMPUTER_IMAGE: PKG_PATH / "tool" / "_tools" / "_computer" / "_resources", } From 0576646be1ff2ca248664b97c5fed258daf55127 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Mon, 13 Jan 2025 15:57:38 -0500 Subject: [PATCH 04/41] feedback --- examples/computer/computer.py | 10 +--------- examples/computer/flag.txt | 1 - .../tool/_tools/_computer/_resources/build_image.sh | 5 ----- .../tool/_tools/_computer/_resources/run_image.sh | 9 --------- 4 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 examples/computer/flag.txt delete mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh delete mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh diff --git a/examples/computer/computer.py b/examples/computer/computer.py index c77b976c7..9e59bf951 100644 --- a/examples/computer/computer.py +++ b/examples/computer/computer.py @@ -24,7 +24,7 @@ def computer_task(): Sample( input="Use the computer tool to find the contents of the file '/tmp/flag.txt'. When you've found it, report its contents.", target="Frunobulax", - files={"/tmp/flag.txt": "flag.txt"}, + files={"/tmp/flag.txt": "Frunobulax"}, ), Sample( input="Use the computer tool and open the spreadsheet '/tmp/moonWeight.ods`. Enter your weight as 156 lbs. Report the result from cell B2. Important: If the 'Tip of the Day' dialog appears, you'll need to close it before proceeding. Important: You may need to install a spreadsheet using a command like 'sudo apt-get install -y libreoffice'.", @@ -39,14 +39,6 @@ def computer_task(): input="Use the computer tool to launch a calculator. Calculate 123 x 456. Report the result.", target="56088", ), - Sample( - input='Draw a smiley face with a paint program. When you are done, submit("Art is in the eye of the beholder"). Important: In XPaint, you need to create a new canvas before you can draw.', - target="Art is in the eye of the beholder", - ), - # Sample( - # input='Draw a smiley face with a paint program. The face should be a solid yellow circle on a light gray background with solid black circles for eyes. The mouth should be a curved black line. When you are done, submit("Art is in the eye of the beholder"). Important: In XPaint, you need to create a new canvas before you can draw. Also, in XPaint, the toolbar contains the following tools on each row. 1. Pencil, Dynamic Pencil, Dot Pencil 2. Brush, Spray, Smear 3. Segment, Polygonal Line, Arc 4. Arrowhead, Text, Erase 5. Box, Filled Box, Box Region 6. Oval, Filled Oval, Oval Region 7. Freehand Shape, Filled Freehand Shape, Freehand Shape Region 8. Polygon, Filled Polygon, Polygon Region 9. Spline Curve, Filled Spline Curve, Spline Curve Region 10. Fill, Gradient Fill, Fractal Fill', - # target='Art is in the eye of the beholder', - # ), ], solver=basic_agent( init=system_message(SYSTEM_MESSAGE), diff --git a/examples/computer/flag.txt b/examples/computer/flag.txt deleted file mode 100644 index 44d731cb9..000000000 --- a/examples/computer/flag.txt +++ /dev/null @@ -1 +0,0 @@ -Frunobulax diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh b/src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh deleted file mode 100755 index 73a7db9d1..000000000 --- a/src/inspect_ai/tool/_tools/_computer/_resources/build_image.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -docker build "$SCRIPT_DIR" -t epatey/inspect-computer-tool:local \ No newline at end of file diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh b/src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh deleted file mode 100755 index ce12223cb..000000000 --- a/src/inspect_ai/tool/_tools/_computer/_resources/run_image.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -docker run -d --rm \ - -v "$SCRIPT_DIR"/computer_tool_support:/home/computeruse/computer_tool_support/ \ - -p 5900:5900 \ - -p 6080:6080 \ - -it epatey/inspect-computer-tool:local \ No newline at end of file From 021a8f4b5c854bdc78ecf179d104274e34eef25c Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Mon, 13 Jan 2025 16:06:39 -0500 Subject: [PATCH 05/41] feedback --- .../tool/_tools/_computer/_common.py | 20 --------- .../tool/_tools/_computer/_computer.py | 2 +- .../tool/_tools/_computer/_computer_split.py | 6 +++ .../tool/_tools/_computer/_mock_logger.py | 44 ------------------- 4 files changed, 7 insertions(+), 65 deletions(-) delete mode 100644 src/inspect_ai/tool/_tools/_computer/_mock_logger.py diff --git a/src/inspect_ai/tool/_tools/_computer/_common.py b/src/inspect_ai/tool/_tools/_computer/_common.py index 78b458b34..506df230d 100644 --- a/src/inspect_ai/tool/_tools/_computer/_common.py +++ b/src/inspect_ai/tool/_tools/_computer/_common.py @@ -1,5 +1,4 @@ import json -import logging from typing import Literal from pydantic import BaseModel, Field @@ -22,10 +21,6 @@ "cursor_position", ] -log = logging.getLogger(__name__) -# log = MockLogger() -log.setLevel(logging.DEBUG) - class ToolExecResult(BaseModel): output: str | None = Field(default=None) @@ -42,7 +37,6 @@ async def _send_cmd(cmdTail: list[str], timeout: int | None = None) -> ToolResul assert sample_id cmd = ["python3", "-m", "computer_tool.computer_tool", "--action"] + cmdTail - log.info(f"(sample={sample_id}) Executing command: {cmd}") try: raw_exec_result = await sandbox().exec(cmd, timeout=timeout) @@ -55,9 +49,6 @@ async def _send_cmd(cmdTail: list[str], timeout: int | None = None) -> ToolResul result = ToolExecResult(**json.loads(raw_exec_result.stdout)) if result.error: - log.warning( - f"(sample={sample_id}) Tool returned an error. Raising ToolError('{result.error}'" - ) raise ToolError(result.error) image = ( @@ -68,28 +59,17 @@ async def _send_cmd(cmdTail: list[str], timeout: int | None = None) -> ToolResul text = result.output if result.output and len(result.output) > 0 else None if text is not None and image is not None: - log.info( - f"(sample={sample_id}) ToolResult([ContentText('{text}'), ContentImage])" - ) return [ContentText(text=text), image] if text is not None: - log.info(f"(sample={sample_id}) ToolResult('{text}')") return text if image is not None: - log.info(f"(sample={sample_id}) ToolResult([ContentImage])") return [image] - log.warning( - "(sample={sample_id}) Tool returned neither output nor image - returning ToolResult('OK')" - ) return "OK" except ToolError: raise - except Exception as e: - log.error(f"(sample={sample_id}) Sandbox.exec threw for {cmd}...re-raising {e}") - raise e async def cursor_position(timeout: int | None = None) -> ToolResult: diff --git a/src/inspect_ai/tool/_tools/_computer/_computer.py b/src/inspect_ai/tool/_tools/_computer/_computer.py index 96e9e1b73..636228022 100644 --- a/src/inspect_ai/tool/_tools/_computer/_computer.py +++ b/src/inspect_ai/tool/_tools/_computer/_computer.py @@ -10,7 +10,7 @@ @tool() -def computer(timeout: int | None = None) -> Tool: +def computer(timeout: int | None = 180) -> Tool: """ Computer interaction tool. diff --git a/src/inspect_ai/tool/_tools/_computer/_computer_split.py b/src/inspect_ai/tool/_tools/_computer/_computer_split.py index 9c0eb5ed6..0faab95dd 100644 --- a/src/inspect_ai/tool/_tools/_computer/_computer_split.py +++ b/src/inspect_ai/tool/_tools/_computer/_computer_split.py @@ -1,3 +1,9 @@ +""" +This module provides the same functionality as the computer tool but via a list of per-action tools . e.g. computer_mouse_move(100, 100). + +The split version is not publicly exported, but is retained until we decide if it performs better than the monolithic computer tool. +""" + from typing import Awaitable, Callable from inspect_ai.tool import Tool, ToolResult, tool diff --git a/src/inspect_ai/tool/_tools/_computer/_mock_logger.py b/src/inspect_ai/tool/_tools/_computer/_mock_logger.py deleted file mode 100644 index dc0c0ad17..000000000 --- a/src/inspect_ai/tool/_tools/_computer/_mock_logger.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -This module is a temporary solution that allows one to alter the log level of a specific child logger. - -As currently implemented, even there is no way to enable DEBUG level console logging for a child logger -without also enabling DEBUG level logging for the root logger. - -This should be resolved, but in the meantime, this module provides a workaround. -""" - -import logging - - -class MockLogger: - level = logging.INFO - - def debug(self, msg: str, *args: object, **kwargs: object) -> None: - if self.level <= logging.DEBUG: - print(f"DEBUG: {msg % args}") - - def info(self, msg: str, *args: object, **kwargs: object) -> None: - if self.level <= logging.INFO: - print(f"INFO: {msg % args}") - - def warning(self, msg: str, *args: object, **kwargs: object) -> None: - if self.level <= logging.WARNING: - print(f"WARNING: {msg % args}") - - def error(self, msg: str, *args: object, **kwargs: object) -> None: - if self.level <= logging.ERROR: - print(f"ERROR: {msg % args}") - - def critical(self, msg: str, *args: object, **kwargs: object) -> None: - if self.level <= logging.CRITICAL: - print(f"CRITICAL: {msg % args}") - - def exception(self, msg: str, *args: object, **kwargs: object) -> None: - print(f"EXCEPTION: {msg % args}") - if "exc_info" in kwargs and kwargs["exc_info"]: - import traceback - - traceback.print_exc() - - def setLevel(self, level: int) -> None: - self.level = level From e8c0d2ce5d70871e6f94cd2130449be575389811 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Mon, 13 Jan 2025 16:19:24 -0500 Subject: [PATCH 06/41] raise RuntimeError rather than Exception --- .../tool/_tools/_computer/_common.py | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_common.py b/src/inspect_ai/tool/_tools/_computer/_common.py index 506df230d..7a497d279 100644 --- a/src/inspect_ai/tool/_tools/_computer/_common.py +++ b/src/inspect_ai/tool/_tools/_computer/_common.py @@ -38,38 +38,35 @@ async def _send_cmd(cmdTail: list[str], timeout: int | None = None) -> ToolResul cmd = ["python3", "-m", "computer_tool.computer_tool", "--action"] + cmdTail - try: - raw_exec_result = await sandbox().exec(cmd, timeout=timeout) + raw_exec_result = await sandbox().exec(cmd, timeout=timeout) - if not raw_exec_result.success: - raise Exception( - f"Failure executing command: ${cmd} {raw_exec_result.stderr}" - ) + if not raw_exec_result.success: + raise RuntimeError( + f"Failure executing command: ${cmd} {raw_exec_result.stderr}" + ) - result = ToolExecResult(**json.loads(raw_exec_result.stdout)) + result = ToolExecResult(**json.loads(raw_exec_result.stdout)) - if result.error: - raise ToolError(result.error) + if result.error: + raise ToolError(result.error) - image = ( - ContentImage(image=f"data:image/png;base64,{result.base64_image}") - if result.base64_image - else None - ) - text = result.output if result.output and len(result.output) > 0 else None + image = ( + ContentImage(image=f"data:image/png;base64,{result.base64_image}") + if result.base64_image + else None + ) + text = result.output if result.output and len(result.output) > 0 else None - if text is not None and image is not None: - return [ContentText(text=text), image] + if text is not None and image is not None: + return [ContentText(text=text), image] - if text is not None: - return text + if text is not None: + return text - if image is not None: - return [image] + if image is not None: + return [image] - return "OK" - except ToolError: - raise + return "OK" async def cursor_position(timeout: int | None = None) -> ToolResult: From 2d32bb46c342629ca8cb71a2406a8dff1cde58ba Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Mon, 13 Jan 2025 16:59:42 -0500 Subject: [PATCH 07/41] Use sandbox_with. --- .../tool/_tools/_computer/_common.py | 25 +++- .../tool/_tools/_computer/_computer.py | 128 +++++++++--------- 2 files changed, 84 insertions(+), 69 deletions(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_common.py b/src/inspect_ai/tool/_tools/_computer/_common.py index 7a497d279..3d38b3275 100644 --- a/src/inspect_ai/tool/_tools/_computer/_common.py +++ b/src/inspect_ai/tool/_tools/_computer/_common.py @@ -1,12 +1,15 @@ import json +from textwrap import dedent from typing import Literal from pydantic import BaseModel, Field from inspect_ai._util.content import ContentText +from inspect_ai._util.error import PrerequisiteError from inspect_ai.model import ContentImage from inspect_ai.tool import ToolError, ToolResult -from inspect_ai.util import sandbox +from inspect_ai.util._sandbox.context import sandbox_with +from inspect_ai.util._sandbox.environment import SandboxEnvironment Action = Literal[ "key", @@ -38,7 +41,7 @@ async def _send_cmd(cmdTail: list[str], timeout: int | None = None) -> ToolResul cmd = ["python3", "-m", "computer_tool.computer_tool", "--action"] + cmdTail - raw_exec_result = await sandbox().exec(cmd, timeout=timeout) + raw_exec_result = await (await computer_sandbox()).exec(cmd, timeout=timeout) if not raw_exec_result.success: raise RuntimeError( @@ -111,3 +114,21 @@ async def press_key(key: str, timeout: int | None = None) -> ToolResult: async def type(text: str, timeout: int | None = None) -> ToolResult: return await _send_cmd(["type", "--text", text], timeout=timeout) + + +async def computer_sandbox() -> SandboxEnvironment: + sb = await sandbox_with("/opt/computer_tool/computer_tool.py") + if sb: + return sb + else: + raise PrerequisiteError( + dedent(""" + The computer tool service was not found in any of the sandboxes for this sample. Please add the computer tool service to your configuration. For example, the following Docker compose file uses the (currently internal) inspect-computer-tool image as its default sandbox: + + services: + default: + # Temporary internal image until the official one is available + image: "inspect-computer-tool" + init: true + """).strip() + ) diff --git a/src/inspect_ai/tool/_tools/_computer/_computer.py b/src/inspect_ai/tool/_tools/_computer/_computer.py index 636228022..9753c6443 100644 --- a/src/inspect_ai/tool/_tools/_computer/_computer.py +++ b/src/inspect_ai/tool/_tools/_computer/_computer.py @@ -62,72 +62,66 @@ async def execute( Returns: The output of the command. Many commands will include a screenshot reflecting the result of the command in their output. """ - try: - if action in ("mouse_move", "left_click_drag"): - if coordinate is None: - raise ToolParsingError(f"coordinate is required for {action}") - if text is not None: - raise ToolParsingError(f"text is not accepted for {action}") - if not isinstance(coordinate, list) or len(coordinate) != 2: - raise ToolParsingError(f"{coordinate} must be a tuple of length 2") - if not all(isinstance(i, int) and i >= 0 for i in coordinate): - raise ToolParsingError( - f"{coordinate} must be a tuple of non-negative ints" - ) - - if action == "mouse_move": - return await common.mouse_move( - coordinate[0], coordinate[1], timeout=timeout - ) - elif action == "left_click_drag": - return await common.left_click_drag( - coordinate[0], coordinate[1], timeout=timeout - ) - - if action in ("key", "type"): - if text is None: - raise ToolParsingError(f"text is required for {action}") - if coordinate is not None: - raise ToolParsingError(f"coordinate is not accepted for {action}") - if not isinstance(text, str): - raise ToolParsingError(output=f"{text} must be a string") - - if action == "key": - return await common.press_key(text, timeout=timeout) - elif action == "type": - return await common.type(text, timeout=timeout) - - if action in ( - "left_click", - "right_click", - "double_click", - "middle_click", - "screenshot", - "cursor_position", - ): - if text is not None: - raise ToolParsingError(f"text is not accepted for {action}") - if coordinate is not None: - raise ToolParsingError(f"coordinate is not accepted for {action}") - - if action == "screenshot": - return await common.screenshot(timeout=timeout) - elif action == "cursor_position": - return await common.cursor_position(timeout=timeout) - elif action == "left_click": - return await common.left_click(timeout=timeout) - elif action == "right_click": - return await common.right_click(timeout=timeout) - elif action == "middle_click": - return await common.middle_click(timeout=timeout) - elif action == "double_click": - return await common.double_click(timeout=timeout) - - raise ToolParsingError(f"Invalid action: {action}") - - except ToolError: - raise - except Exception as e: - raise ToolError(str(e)) + if action in ("mouse_move", "left_click_drag"): + if coordinate is None: + raise ToolParsingError(f"coordinate is required for {action}") + if text is not None: + raise ToolParsingError(f"text is not accepted for {action}") + if not isinstance(coordinate, list) or len(coordinate) != 2: + raise ToolParsingError(f"{coordinate} must be a tuple of length 2") + if not all(isinstance(i, int) and i >= 0 for i in coordinate): + raise ToolParsingError( + f"{coordinate} must be a tuple of non-negative ints" + ) + + if action == "mouse_move": + return await common.mouse_move( + coordinate[0], coordinate[1], timeout=timeout + ) + elif action == "left_click_drag": + return await common.left_click_drag( + coordinate[0], coordinate[1], timeout=timeout + ) + + if action in ("key", "type"): + if text is None: + raise ToolParsingError(f"text is required for {action}") + if coordinate is not None: + raise ToolParsingError(f"coordinate is not accepted for {action}") + if not isinstance(text, str): + raise ToolParsingError(output=f"{text} must be a string") + + if action == "key": + return await common.press_key(text, timeout=timeout) + elif action == "type": + return await common.type(text, timeout=timeout) + + if action in ( + "left_click", + "right_click", + "double_click", + "middle_click", + "screenshot", + "cursor_position", + ): + if text is not None: + raise ToolParsingError(f"text is not accepted for {action}") + if coordinate is not None: + raise ToolParsingError(f"coordinate is not accepted for {action}") + + if action == "screenshot": + return await common.screenshot(timeout=timeout) + elif action == "cursor_position": + return await common.cursor_position(timeout=timeout) + elif action == "left_click": + return await common.left_click(timeout=timeout) + elif action == "right_click": + return await common.right_click(timeout=timeout) + elif action == "middle_click": + return await common.middle_click(timeout=timeout) + elif action == "double_click": + return await common.double_click(timeout=timeout) + + raise ToolParsingError(f"Invalid action: {action}") return execute From de503a061a6020f90d7559d1c44e18f44ef53720 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 07:27:42 -0500 Subject: [PATCH 08/41] ruff --- src/inspect_ai/tool/_tools/_computer/_computer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_computer.py b/src/inspect_ai/tool/_tools/_computer/_computer.py index 9753c6443..7e7ecfe99 100644 --- a/src/inspect_ai/tool/_tools/_computer/_computer.py +++ b/src/inspect_ai/tool/_tools/_computer/_computer.py @@ -1,6 +1,6 @@ from typing import Awaitable, Callable -from inspect_ai.tool import Tool, ToolError, ToolResult, tool +from inspect_ai.tool import Tool, ToolResult, tool from inspect_ai.tool._tool import ToolParsingError from . import _common as common From 780c54cfe01098cbf7cd36c7b481c69cf31a7935 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 07:50:48 -0500 Subject: [PATCH 09/41] first draft of computer use docs --- docs/images/vnc-view-only.png | Bin 0 -> 39832 bytes docs/tools.qmd | 114 +++++++++++++++++++++++++++++++--- 2 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 docs/images/vnc-view-only.png diff --git a/docs/images/vnc-view-only.png b/docs/images/vnc-view-only.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe1a580d92a0b271d7350e76108e15abea43c28 GIT binary patch literal 39832 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 Date: Tue, 14 Jan 2025 08:31:20 -0500 Subject: [PATCH 10/41] First steps in making port mappings available in SandboxConnection --- src/inspect_ai/util/_sandbox/docker/docker.py | 39 +++++++++++++++++++ src/inspect_ai/util/_sandbox/environment.py | 14 +++++++ 2 files changed, 53 insertions(+) diff --git a/src/inspect_ai/util/_sandbox/docker/docker.py b/src/inspect_ai/util/_sandbox/docker/docker.py index 1ed508979..733335527 100644 --- a/src/inspect_ai/util/_sandbox/docker/docker.py +++ b/src/inspect_ai/util/_sandbox/docker/docker.py @@ -1,4 +1,5 @@ import errno +import json import os import tempfile from logging import getLogger @@ -10,6 +11,8 @@ from inspect_ai.util._subprocess import ExecResult from ..environment import ( + HostMapping, + PortMapping, SandboxConnection, SandboxEnvironment, SandboxEnvironmentConfigType, @@ -466,3 +469,39 @@ async def container_working_dir( + f"{result.stderr}" ) return default + + +def parse_docker_inspect_ports(json_str: str) -> list[PortMapping] | None: + """ + Parses the JSON output from `docker inspect {container_name} --format='{{json .NetworkSettings.Ports}}'` to extract port mappings. + + Args: + json_str (str): A JSON string representing the `NetworkSettings.Ports` output of `docker inspect`. e.g. + ``` + { + "5900/tcp": [{"HostIp": "0.0.0.0", "HostPort": "54023"}], + "8080/tcp": [{"HostIp": "0.0.0.0", "HostPort": "54024"}] + } + ``` + + Returns: + list[PortMapping] | None: A list of PortMapping objects if any port mappings are found, + otherwise None. + """ + data = json.loads(json_str) + port_mappings = [] + for port_protocol, mappings in data.items(): + if mappings is None: + continue + container_port, protocol = port_protocol.split("/") + host_mappings = [ + HostMapping(host_ip=mapping["HostIp"], host_port=int(mapping["HostPort"])) + for mapping in mappings + ] + port_mapping = PortMapping( + container_port=int(container_port), + protocol=protocol, + mappings=host_mappings, + ) + port_mappings.append(port_mapping) + return port_mappings if port_mappings else None diff --git a/src/inspect_ai/util/_sandbox/environment.py b/src/inspect_ai/util/_sandbox/environment.py index 774e85b21..dceb456b7 100644 --- a/src/inspect_ai/util/_sandbox/environment.py +++ b/src/inspect_ai/util/_sandbox/environment.py @@ -28,6 +28,17 @@ ] +class HostMapping(BaseModel): + host_ip: str + host_port: int + + +class PortMapping(BaseModel): + container_port: int + protocol: Literal["tcp", "udp"] + mappings: list[HostMapping] + + class SandboxConnection(BaseModel): """Information required to connect to sandbox.""" @@ -37,6 +48,9 @@ class SandboxConnection(BaseModel): vscode_command: list[Any] | None = Field(default=None) """Optional vscode command (+args) to connect to sandbox.""" + port_mappings: list[PortMapping] | None = Field(default=None) + """Optional list of port mappings into container""" + class SandboxEnvironment(abc.ABC): """Environment for executing arbitrary code from tools. From ae858e9b4973c853134e1a2f37197f57dee5e42c Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 08:57:38 -0500 Subject: [PATCH 11/41] Plumb the actual port mappings --- src/inspect_ai/util/_sandbox/docker/docker.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/inspect_ai/util/_sandbox/docker/docker.py b/src/inspect_ai/util/_sandbox/docker/docker.py index 733335527..83994dd56 100644 --- a/src/inspect_ai/util/_sandbox/docker/docker.py +++ b/src/inspect_ai/util/_sandbox/docker/docker.py @@ -8,7 +8,7 @@ from typing_extensions import override -from inspect_ai.util._subprocess import ExecResult +from inspect_ai.util._subprocess import ExecResult, subprocess from ..environment import ( HostMapping, @@ -434,13 +434,28 @@ async def connection(self) -> SandboxConnection: ) # return container connection + if container: + ports_result = await subprocess( + [ + "docker", + "inspect", + container, + "--format", + "{{json .NetworkSettings.Ports}}", + ] + ) + + if not ports_result.success: + raise RuntimeError(ports_result.stderr) + return SandboxConnection( command=f"docker exec -it {container} bash -l", vscode_command=[ "remote-containers.attachToRunningContainer", container, ], + port_mappings=parse_docker_inspect_ports(ports_result.stdout), ) # error (not currently running) else: From 060f5eb544ff33a21fe229936ea96ff986cc5207 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 09:03:28 -0500 Subject: [PATCH 12/41] remove stray whitespace --- examples/computer/compose.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/computer/compose.yaml b/examples/computer/compose.yaml index e6e4f0fa7..d6133c471 100644 --- a/examples/computer/compose.yaml +++ b/examples/computer/compose.yaml @@ -12,5 +12,5 @@ services: # If you launch multiple containers, you can vnc into each container by using the # following port mapping, but you will need to determine the host port number for # the specific container by using `docker inspect ` - # ports: - # - "5900" + ports: + - "5900" From 3fae390ba530225e8b4cd2b1cc47b1b8b1d5afbb Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 09:04:57 -0500 Subject: [PATCH 13/41] whoops --- src/inspect_ai/util/_sandbox/docker/docker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/inspect_ai/util/_sandbox/docker/docker.py b/src/inspect_ai/util/_sandbox/docker/docker.py index 83994dd56..d4dc1a75f 100644 --- a/src/inspect_ai/util/_sandbox/docker/docker.py +++ b/src/inspect_ai/util/_sandbox/docker/docker.py @@ -434,7 +434,6 @@ async def connection(self) -> SandboxConnection: ) # return container connection - if container: ports_result = await subprocess( [ From 4463525989ea625996b1c90e703b836cc8bd7497 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 10:42:13 -0500 Subject: [PATCH 14/41] Surface port mappings in SandboxesView --- examples/computer/compose.yaml | 1 + .../_display/textual/widgets/samples.py | 44 ++++++++++++------- .../_tools/_computer/_resources/Dockerfile | 1 + 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/examples/computer/compose.yaml b/examples/computer/compose.yaml index d6133c471..9ec3932bd 100644 --- a/examples/computer/compose.yaml +++ b/examples/computer/compose.yaml @@ -14,3 +14,4 @@ services: # the specific container by using `docker inspect ` ports: - "5900" + - "8080" diff --git a/src/inspect_ai/_display/textual/widgets/samples.py b/src/inspect_ai/_display/textual/widgets/samples.py index 40b467e2d..2c675b581 100644 --- a/src/inspect_ai/_display/textual/widgets/samples.py +++ b/src/inspect_ai/_display/textual/widgets/samples.py @@ -5,27 +5,17 @@ from rich.table import Table from rich.text import Text from textual.app import ComposeResult -from textual.containers import ( - Horizontal, - HorizontalGroup, - Vertical, - VerticalGroup, -) +from textual.containers import Horizontal, HorizontalGroup, Vertical, VerticalGroup from textual.reactive import reactive from textual.widget import Widget -from textual.widgets import ( - Button, - Collapsible, - LoadingIndicator, - OptionList, - Static, -) +from textual.widgets import Button, Collapsible, LoadingIndicator, OptionList, Static from textual.widgets.option_list import Option, Separator from inspect_ai._util.format import format_progress_time from inspect_ai._util.registry import registry_unqualified_name from inspect_ai.log._samples import ActiveSample from inspect_ai.log._transcript import ToolEvent +from inspect_ai.util._sandbox.environment import PortMapping from .clock import Clock from .transcript import TranscriptView @@ -218,6 +208,7 @@ class SampleInfo(Horizontal): def __init__(self) -> None: super().__init__() self._sample: ActiveSample | None = None + self._sandbox_count: int | None = None def compose(self) -> ComposeResult: with Collapsible(title=""): @@ -233,12 +224,15 @@ async def sync_sample(self, sample: ActiveSample | None) -> None: limits = self.query_one(SampleLimits) await limits.sync_sample(sample) + new_sandbox_count = len(sample.sandboxes) # bail if we've already processed this sample - if self._sample == sample: + if self._sample == sample and self._sandbox_count == new_sandbox_count: + print("bailing since sample didn't change") return # set sample self._sample = sample + self._sandbox_count = new_sandbox_count # update UI self.display = True @@ -311,6 +305,7 @@ def compose(self) -> ComposeResult: yield Vertical(id="sandboxes-list") async def sync_sample(self, sample: ActiveSample) -> None: + print(f"in SandboxesView with {sample.task} and {len(sample.sandboxes)}") if len(sample.sandboxes) > 0: self.display = True sandboxes_caption = cast(Static, self.query_one("#sandboxes-caption")) @@ -319,7 +314,12 @@ async def sync_sample(self, sample: ActiveSample) -> None: sandboxes_list = self.query_one("#sandboxes-list") await sandboxes_list.remove_children() await sandboxes_list.mount_all( - [Static(sandbox.command) for sandbox in sample.sandboxes.values()] + [ + item + for sandbox in sample.sandboxes.values() + for item in [Static(sandbox.command)] + + create_port_mapping_statics(sandbox.port_mappings) + ] ) sandboxes_list.mount( Static( @@ -332,6 +332,20 @@ async def sync_sample(self, sample: ActiveSample) -> None: self.display = False +def create_port_mapping_statics( + port_mappings: list[PortMapping] | None, +) -> list[Static]: + if port_mappings is None: + return [] + return [ + Static( + f"{host_mapping.host_ip}:{host_mapping.host_port} => {mapping.container_port}" + ) + for mapping in port_mappings + for host_mapping in mapping.mappings + ] + + class SampleToolbar(Horizontal): STATUS_GROUP = "status_group" TIMEOUT_TOOL_CALL = "timeout_tool_call" diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index c320dfef9..03f5839ef 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -69,6 +69,7 @@ COPY computer_tool/ /opt/computer_tool ENV PYTHONPATH=/opt EXPOSE 5900 +EXPOSE 8080 ARG DISPLAY_NUM=1 ARG HEIGHT=768 From f55382e1378a262822ff1b64b73021a8565346d1 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 10:57:56 -0500 Subject: [PATCH 15/41] approval: glob match full function call --- src/inspect_ai/approval/_policy.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/inspect_ai/approval/_policy.py b/src/inspect_ai/approval/_policy.py index 8314934ba..b4625a352 100644 --- a/src/inspect_ai/approval/_policy.py +++ b/src/inspect_ai/approval/_policy.py @@ -1,13 +1,13 @@ import fnmatch -import re +import sys from dataclasses import dataclass from pathlib import Path -from re import Pattern from typing import Any, Generator, cast from pydantic import BaseModel, Field, model_validator from inspect_ai._util.config import read_config_object +from inspect_ai._util.format import format_function_call from inspect_ai._util.registry import registry_create, registry_lookup from inspect_ai.solver._task_state import TaskState from inspect_ai.tool._tool_call import ToolCall, ToolCallView @@ -30,17 +30,23 @@ def policy_approver(policies: str | list[ApprovalPolicy]) -> Approver: policies = approval_policies_from_config(policies) # compile policy into approvers and regexes for matching - policy_matchers: list[tuple[list[Pattern[str]], Approver]] = [] + policy_matchers: list[tuple[list[str], Approver]] = [] for policy in policies: tools = [policy.tools] if isinstance(policy.tools, str) else policy.tools - patterns = [re.compile(fnmatch.translate(tool)) for tool in tools] - policy_matchers.append((patterns, policy.approver)) + globs = [f"{tool}*" for tool in tools] + policy_matchers.append((globs, policy.approver)) # generator for policies that match a tool_call def tool_approvers(tool_call: ToolCall) -> Generator[Approver, None, None]: for policy_matcher in iter(policy_matchers): + function_call = format_function_call( + tool_call.function, tool_call.arguments, width=sys.maxsize + ) if any( - [pattern.match(tool_call.function) for pattern in policy_matcher[0]] + [ + fnmatch.fnmatch(function_call, pattern) + for pattern in policy_matcher[0] + ] ): yield policy_matcher[1] From 1c89263ac7d7ee524396b1ec52283942da316117 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 12:38:29 -0500 Subject: [PATCH 16/41] port mappings step --- .../_display/textual/widgets/samples.py | 21 +++++----- src/inspect_ai/_eval/task/run.py | 5 +-- src/inspect_ai/util/_sandbox/docker/docker.py | 38 ++++++++++++------- src/inspect_ai/util/_sandbox/environment.py | 2 +- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/inspect_ai/_display/textual/widgets/samples.py b/src/inspect_ai/_display/textual/widgets/samples.py index 2c675b581..b4c2e53a9 100644 --- a/src/inspect_ai/_display/textual/widgets/samples.py +++ b/src/inspect_ai/_display/textual/widgets/samples.py @@ -227,7 +227,6 @@ async def sync_sample(self, sample: ActiveSample | None) -> None: new_sandbox_count = len(sample.sandboxes) # bail if we've already processed this sample if self._sample == sample and self._sandbox_count == new_sandbox_count: - print("bailing since sample didn't change") return # set sample @@ -289,6 +288,9 @@ class SandboxesView(Vertical): background: transparent; height: auto; } + #sandboxes-list { + height: auto; + } SandboxesView Static { background: transparent; } @@ -305,7 +307,6 @@ def compose(self) -> ComposeResult: yield Vertical(id="sandboxes-list") async def sync_sample(self, sample: ActiveSample) -> None: - print(f"in SandboxesView with {sample.task} and {len(sample.sandboxes)}") if len(sample.sandboxes) > 0: self.display = True sandboxes_caption = cast(Static, self.query_one("#sandboxes-caption")) @@ -318,16 +319,16 @@ async def sync_sample(self, sample: ActiveSample) -> None: item for sandbox in sample.sandboxes.values() for item in [Static(sandbox.command)] - + create_port_mapping_statics(sandbox.port_mappings) + + create_port_mapping_statics(sandbox.ports) + + [ + Static( + "[italic]Hold down Alt (or Option) to select text for copying[/italic]", + classes="clipboard-message", + markup=True, + ), + ] ] ) - sandboxes_list.mount( - Static( - "[italic]Hold down Alt (or Option) to select text for copying[/italic]", - classes="clipboard-message", - markup=True, - ) - ) else: self.display = False diff --git a/src/inspect_ai/_eval/task/run.py b/src/inspect_ai/_eval/task/run.py index d11fa3177..af7309600 100644 --- a/src/inspect_ai/_eval/task/run.py +++ b/src/inspect_ai/_eval/task/run.py @@ -26,10 +26,7 @@ from inspect_ai._util.datetime import iso_now from inspect_ai._util.error import exception_message from inspect_ai._util.hooks import send_telemetry -from inspect_ai._util.registry import ( - is_registry_object, - registry_log_name, -) +from inspect_ai._util.registry import is_registry_object, registry_log_name from inspect_ai._util.timeouts import Timeout, timeout, timeout_at from inspect_ai._view.notify import view_notify_eval from inspect_ai.dataset import Dataset, Sample diff --git a/src/inspect_ai/util/_sandbox/docker/docker.py b/src/inspect_ai/util/_sandbox/docker/docker.py index d4dc1a75f..6829a012b 100644 --- a/src/inspect_ai/util/_sandbox/docker/docker.py +++ b/src/inspect_ai/util/_sandbox/docker/docker.py @@ -435,26 +435,13 @@ async def connection(self) -> SandboxConnection: # return container connection if container: - ports_result = await subprocess( - [ - "docker", - "inspect", - container, - "--format", - "{{json .NetworkSettings.Ports}}", - ] - ) - - if not ports_result.success: - raise RuntimeError(ports_result.stderr) - return SandboxConnection( command=f"docker exec -it {container} bash -l", vscode_command=[ "remote-containers.attachToRunningContainer", container, ], - port_mappings=parse_docker_inspect_ports(ports_result.stdout), + ports=await get_ports_info(container), ) # error (not currently running) else: @@ -485,6 +472,29 @@ async def container_working_dir( return default +async def get_ports_info(container: str) -> list[PortMapping] | None: + try: + result = await subprocess( + [ + "docker", + "inspect", + container, + "--format", + "{{json .NetworkSettings.Ports}}", + ], + timeout=60, + ) + + if not result.success: + raise RuntimeError(result.stderr) + + return parse_docker_inspect_ports(result.stdout) + + # It's currently a policy decision to let docker timeouts to be silent. + except TimeoutError: + return None + + def parse_docker_inspect_ports(json_str: str) -> list[PortMapping] | None: """ Parses the JSON output from `docker inspect {container_name} --format='{{json .NetworkSettings.Ports}}'` to extract port mappings. diff --git a/src/inspect_ai/util/_sandbox/environment.py b/src/inspect_ai/util/_sandbox/environment.py index dceb456b7..fd2a01045 100644 --- a/src/inspect_ai/util/_sandbox/environment.py +++ b/src/inspect_ai/util/_sandbox/environment.py @@ -48,7 +48,7 @@ class SandboxConnection(BaseModel): vscode_command: list[Any] | None = Field(default=None) """Optional vscode command (+args) to connect to sandbox.""" - port_mappings: list[PortMapping] | None = Field(default=None) + ports: list[PortMapping] | None = Field(default=None) """Optional list of port mappings into container""" From 47fe15ae0a13beed61132c8ac4bc99b846fbc92f Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 13:02:50 -0500 Subject: [PATCH 17/41] propagate --display cli option --- src/inspect_ai/_eval/eval.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/inspect_ai/_eval/eval.py b/src/inspect_ai/_eval/eval.py index d88fa0bc4..b705a8028 100644 --- a/src/inspect_ai/_eval/eval.py +++ b/src/inspect_ai/_eval/eval.py @@ -1,7 +1,7 @@ import logging import os from pathlib import Path -from typing import Any, Literal, cast +from typing import Any, Literal from shortuuid import uuid from typing_extensions import Unpack @@ -9,7 +9,7 @@ from inspect_ai._cli.util import parse_cli_args from inspect_ai._display.core.active import display as task_display from inspect_ai._util.config import resolve_args -from inspect_ai._util.constants import DEFAULT_DISPLAY, DEFAULT_LOG_FORMAT +from inspect_ai._util.constants import DEFAULT_LOG_FORMAT from inspect_ai._util.error import PrerequisiteError from inspect_ai._util.file import absolute_file_path from inspect_ai._util.logger import warn_once @@ -834,7 +834,7 @@ def init_eval_display( display = "conversation" # apply default and init - display = display or cast(DisplayType, DEFAULT_DISPLAY) + display = display or display_type() init_display_type(display) # adapt task/samples as required if we are in conversation mode From f9c30a89ea6122ba5e13aa021f1d51b7a0a7b646 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 13:22:34 -0500 Subject: [PATCH 18/41] make no content a global constant --- src/inspect_ai/_util/constants.py | 1 + src/inspect_ai/model/_providers/anthropic.py | 11 +++++------ src/inspect_ai/model/_providers/google.py | 5 +---- src/inspect_ai/model/_providers/mistral.py | 4 +--- src/inspect_ai/model/_providers/vertex.py | 5 +---- 5 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/inspect_ai/_util/constants.py b/src/inspect_ai/_util/constants.py index 0d90cf12e..55fe40ad6 100644 --- a/src/inspect_ai/_util/constants.py +++ b/src/inspect_ai/_util/constants.py @@ -37,3 +37,4 @@ CONSOLE_DISPLAY_WIDTH = 120 BASE_64_DATA_REMOVED = "" SANDBOX_SETUP_TIMEOUT = 300 +NO_CONTENT = "(no content)" diff --git a/src/inspect_ai/model/_providers/anthropic.py b/src/inspect_ai/model/_providers/anthropic.py index f09441f75..5974283af 100644 --- a/src/inspect_ai/model/_providers/anthropic.py +++ b/src/inspect_ai/model/_providers/anthropic.py @@ -33,7 +33,11 @@ from pydantic import JsonValue from typing_extensions import override -from inspect_ai._util.constants import BASE_64_DATA_REMOVED, DEFAULT_MAX_RETRIES +from inspect_ai._util.constants import ( + BASE_64_DATA_REMOVED, + DEFAULT_MAX_RETRIES, + NO_CONTENT, +) from inspect_ai._util.content import Content, ContentImage, ContentText from inspect_ai._util.error import exception_message from inspect_ai._util.images import file_as_data_uri @@ -459,11 +463,6 @@ def message_tool_choice(tool_choice: ToolChoice) -> message_create_params.ToolCh return {"type": "auto"} -# text we insert when there is no content passed -# (as this will result in an Anthropic API error) -NO_CONTENT = "(no content)" - - async def message_param(message: ChatMessage) -> MessageParam: # no system role for anthropic (this is more like an assertion, # as these should have already been filtered out) diff --git a/src/inspect_ai/model/_providers/google.py b/src/inspect_ai/model/_providers/google.py index c8227b40c..bbe90fa29 100644 --- a/src/inspect_ai/model/_providers/google.py +++ b/src/inspect_ai/model/_providers/google.py @@ -51,7 +51,7 @@ from pydantic import JsonValue from typing_extensions import override -from inspect_ai._util.constants import BASE_64_DATA_REMOVED +from inspect_ai._util.constants import BASE_64_DATA_REMOVED, NO_CONTENT from inspect_ai._util.content import ( Content, ContentAudio, @@ -316,9 +316,6 @@ def consective_tool_message_reducer( return messages -NO_CONTENT = "(no content)" - - async def content_dict( message: ChatMessageUser | ChatMessageAssistant | ChatMessageTool, ) -> ContentDict: diff --git a/src/inspect_ai/model/_providers/mistral.py b/src/inspect_ai/model/_providers/mistral.py index 95baf3339..fb69f673c 100644 --- a/src/inspect_ai/model/_providers/mistral.py +++ b/src/inspect_ai/model/_providers/mistral.py @@ -40,6 +40,7 @@ # https://github.com/mistralai/client-python/blob/main/MIGRATION.md from inspect_ai._util.constants import ( DEFAULT_TIMEOUT, + NO_CONTENT, ) from inspect_ai._util.content import Content, ContentImage, ContentText from inspect_ai._util.images import file_as_data_uri @@ -326,9 +327,6 @@ async def mistral_chat_message( ) -NO_CONTENT = "(no content)" - - async def mistral_message_content( content: str | list[Content], ) -> str | list[ContentChunk]: diff --git a/src/inspect_ai/model/_providers/vertex.py b/src/inspect_ai/model/_providers/vertex.py index 5eee17b7e..ca827c0be 100644 --- a/src/inspect_ai/model/_providers/vertex.py +++ b/src/inspect_ai/model/_providers/vertex.py @@ -23,7 +23,7 @@ ) from vertexai.generative_models import Content as VertexContent -from inspect_ai._util.constants import BASE_64_DATA_REMOVED +from inspect_ai._util.constants import BASE_64_DATA_REMOVED, NO_CONTENT from inspect_ai._util.content import ( Content, ContentAudio, @@ -250,9 +250,6 @@ def consective_tool_message_reducer( return messages -NO_CONTENT = "(no content)" - - async def content_dict( message: ChatMessageUser | ChatMessageAssistant | ChatMessageTool, ) -> VertexContent: From 0d33f520e5152159277847749f251463d5778493 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 14:03:17 -0500 Subject: [PATCH 19/41] task config: custom args have display priority over config --- src/inspect_ai/_display/core/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/inspect_ai/_display/core/config.py b/src/inspect_ai/_display/core/config.py index 990154be6..2796753bf 100644 --- a/src/inspect_ai/_display/core/config.py +++ b/src/inspect_ai/_display/core/config.py @@ -13,14 +13,14 @@ def task_config( value = task_args[key] if is_registry_dict(value): task_args[key] = value["name"] - config = task_args | dict(profile.eval_config.model_dump(exclude_none=True)) + config = dict(profile.eval_config.model_dump(exclude_none=True)) | task_args if generate_config: - config = config | dict(profile.generate_config.model_dump(exclude_none=True)) + config = dict(profile.generate_config.model_dump(exclude_none=True)) | config if profile.tags: config["tags"] = ",".join(profile.tags) config_print: list[str] = [] for name, value in config.items(): - if name == "approval": + if name == "approval" and isinstance(value, dict): config_print.append( f"{name}: {','.join([approver['name'] for approver in value['approvers']])}" ) From 833f4ec0bf3e66bff6daabe0638987adc04046ff Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 14:03:34 -0500 Subject: [PATCH 20/41] tighten up conversation mode --- src/inspect_ai/model/_conversation.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/inspect_ai/model/_conversation.py b/src/inspect_ai/model/_conversation.py index 6b3dd6aa4..44892347d 100644 --- a/src/inspect_ai/model/_conversation.py +++ b/src/inspect_ai/model/_conversation.py @@ -1,6 +1,7 @@ from rich.console import RenderableType from rich.text import Text +from inspect_ai._util.constants import NO_CONTENT from inspect_ai._util.rich import lines_display from inspect_ai._util.transcript import transcript_markdown from inspect_ai.util._conversation import conversation_panel @@ -15,13 +16,16 @@ def conversation_tool_mesage(message: ChatMessageTool) -> None: if display_type() == "conversation": # truncate output to 100 lines - output = message.error.message if message.error else message.text.strip() - content = lines_display(output, 100) - - conversation_panel( - title=f"Tool Output: {message.function}", - content=content, + output = ( + message.error.message.strip() if message.error else message.text.strip() ) + if output: + content = lines_display(output, 100) + + conversation_panel( + title=f"Tool Output: {message.function}", + content=content, + ) def conversation_assistant_message( @@ -37,12 +41,15 @@ def conversation_assistant_message( # start with assistant content content: list[RenderableType] = ( - [transcript_markdown(message.text, escape=True)] if message.text else [] + [transcript_markdown(message.text, escape=True)] + if message.text and message.text != NO_CONTENT + else [] ) # print tool calls if message.tool_calls: - content.append(Text()) + if content: + content.append(Text()) content.extend(render_tool_calls(message.tool_calls)) # print the assistant message From 0262cf7096b5604e4aab2f2c3baa0e384e31842f Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 14:04:33 -0500 Subject: [PATCH 21/41] tweaks to intervention mode example --- examples/intervention/README.md | 169 +++--------------- examples/intervention/computer/approval.yaml | 10 ++ .../compose.yaml} | 0 examples/intervention/intervention.py | 72 ++++---- examples/intervention/{ => shell}/Dockerfile | 0 .../intervention/{ => shell}/compose.yaml | 0 6 files changed, 77 insertions(+), 174 deletions(-) create mode 100644 examples/intervention/computer/approval.yaml rename examples/intervention/{computer-compose.yaml => computer/compose.yaml} (100%) rename examples/intervention/{ => shell}/Dockerfile (100%) rename examples/intervention/{ => shell}/compose.yaml (100%) diff --git a/examples/intervention/README.md b/examples/intervention/README.md index f62380871..55d19be50 100644 --- a/examples/intervention/README.md +++ b/examples/intervention/README.md @@ -1,164 +1,47 @@ -# Intervention Mode Demo +# Intervention Demo ## Introduction -This is a prototype of an Inspect agent with human intervention. It utilises Inspect's [Interactivity features](https://inspect.ai-safety-institute.org.uk/interactivity.html). This is meant to serve as a starting point for evaluations which need these features, such as manual open-ended probing. +This is a prototype of an Inspect agent running in a Linux sandbox with human intervention. It utilises Inspect's [Interactivity features](https://inspect.ai-safety-institute.org.uk/interactivity.html). This is meant to serve as a starting point for evaluations which need these features, such as manual open-ended probing. -This gives an overview of this task and how to customise it. Note that this task is intended to be run within Inspect's approval mode (so you can confirm tool calls) and conversation display mode (so you can see the conversation with the model). For example: +## Usage Modes -``` bash -inspect eval exmaples/intervention.py --approval human --display conversation -``` - - -## Inspect Code - -### Task Definition - -At the top of `intervention.py`, we have our Inspect task: - -``` python -@task -def intervention(): - return Task( - solver=[ - system_prompt(), - user_prompt(), - use_tools([bash(), python()]), - agent_loop(), - ], - sandbox="docker", - ) -``` - -As you can see, this is just a regular Inspect evaluation. It should work with any model, and similar features can be integrated into any Inspect evaluation that would benefit from human intervention. - -A few things to note here: - -- To add more tools, just pass them to the `agent_loop()`. -- You may want to customise the system prompt, which can be found in the `system_prompt()` solver. -- It uses an agent loop using the [lower level `model.generate()` API.](https://inspect.ai-safety-institute.org.uk/agents-api.html) - -### User Prompt - -First, we ask the user to enter a prompt for the model: +Two modes are supported: `shell` mode equips the model with bash and python tools, and `computer` mode provides it with a full desktop computer. To run in the (default) shell mode, use this (note we also specify `--display=conversation` to print all of the user and assistant messages to the terminal): -``` python -@solver -def user_prompt() -> Solver: - async def solve(state: TaskState, generate: Generate) -> TaskState: - with input_screen("User Prompt") as console: - state.user_prompt.content = Prompt.ask( - "Please enter your initial prompt for the model:\n\n", console=console - ) - return state - - return solve -``` - -If you have a static prompt you want to use, or a dataset of these, you could put those in your `Task` `Dataset` and then skip the use of this solver. - -### Agent Loop - -The agent loop is [just a plain Inspect solver.](https://inspect.ai-safety-institute.org.uk/solvers.html). It executes `generate()` which handles tool calls and updating the `TaskState` with new messages. Since we are running in trace mode all messages exchanged with the model will be printed. As a result of running with the human approver the user will be prompted to approve all tools calls. - -``` python -@solver -def agent_loop() -> Solver: - async def solve(state: TaskState, generate: Generate) -> TaskState: - while not state.completed: - # generate w/ tool calls, approvals, etc. - state = await generate(state) - - # prompt for next action - next_action = ask_for_next_action() - with input_screen(): - match next_action.strip().lower(): - case "exit": - break - case "": - state.messages.append( - ChatMessageUser( - content="Please continue working on this task." - ) - ) - continue - case _: - state.messages.append(ChatMessageUser(content=next_action)) - - return state - - return solve +``` bash +inspect eval examples/intervention.py --display conversation ``` -Once the model stops calling tools, the user will get a choice to terminate the conversation, force another generation, or send a new user message to the model. - -## Sandboxing - -This evaluation is sandboxed in a Docker container. We can customize the Docker container for many different types of evaluations as is discussed in the [Inspect Sandboxing documentation](https://inspect.ai-safety-institute.org.uk/sandboxing.html). - -### The Dockerfile +To run in computer mode, use the `mode` task parameter: -The Dockerfile is pretty simple for this demo. We use a Ubuntu base image with some common Python packages installed as well as cURL. Feel free to install other packages you want. - -``` dockerfile -FROM ubuntu:24.04 - -# Update the package lists -RUN apt-get update -y && apt-get upgrade -y - -# Install any necessary packages -RUN apt-get install -y curl python3 python3-pip python3-dev python3-venv +``` bash +inspect eval examples/intervention.py -T mode=computer --display conversation ``` -We then set up a virtual environment and add it to the `PATH` so that the agent doesn't need to worry about that. +See the documentation on the [Computer Tool](https://inspect.ai-safety-institute.org.uk/tools.html#sec-computer) for additional details on Inspect comptuer use. -``` dockerfile -# Virtual environment setup -ENV VIRTUAL_ENV=/opt/venv -RUN python3 -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" -``` +## Approval -We also mock `sudo` as it's unnecessary in Docker, and models tend to get confused by the error messages resulting from `sudo` not being installed. +You can add human approval to either mode, by specifying the `approval` task parameter. For example: -``` dockerfile -# Mock sudo to avoid permission issues -RUN echo -e '#!/bin/sh\nexec "$@"' > /usr/bin/sudo && chmod +x /usr/bin/sudo +``` bash +inspect eval examples/intervention.py -T mode=shell -T approval=true --display conversation ``` -### Docker Compose +For `shell` mode, this will result in each and every bash or python call requiring approval. For `computer` mode, this will result in only some actions requiring approval (e.g. clicks require approval, but mouse moves do not). Here is the approval.yaml file used for computer mode: -We have a simple Docker Compose file which starts up a container specified in the `Dockerfile`. +```{.yaml filename="approval.yaml"} +approvers: + - name: human + tools: + - computer(action='key' + - computer(action='left_click' + - computer(action='middle_click' + - computer(action='double_click' -``` docker -version: '3' -services: - default: - build: . - command: tail -f /dev/null - cpus: 1.0 - mem_limit: 0.5gb - network_mode: bridge + - name: auto + tools: "*" ``` -You can customise this for advanced behaviours, such as GPU passthrough or multiple containers. Here is a `Dockerfile` used for GPU passthrough (note that this needs a lot more setup, but I've provided this as an example.) - -``` docker -version: '3' -services: - default: - build: . - command: tail -f /dev/null - cpus: 7.0 - mem_limit: 28.0gb - network_mode: bridge - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: all - capabilities: [gpu] -``` \ No newline at end of file +See the [Approval](https://inspect.ai-safety-institute.org.uk/approval.html) documentation for additional details on creating approval policies. diff --git a/examples/intervention/computer/approval.yaml b/examples/intervention/computer/approval.yaml new file mode 100644 index 000000000..f49f96cbd --- /dev/null +++ b/examples/intervention/computer/approval.yaml @@ -0,0 +1,10 @@ +approvers: + - name: human + tools: + - computer(action='key' + - computer(action='left_click' + - computer(action='middle_click' + - computer(action='double_click' + + - name: auto + tools: "*" diff --git a/examples/intervention/computer-compose.yaml b/examples/intervention/computer/compose.yaml similarity index 100% rename from examples/intervention/computer-compose.yaml rename to examples/intervention/computer/compose.yaml diff --git a/examples/intervention/intervention.py b/examples/intervention/intervention.py index d1fb00a3c..e012a7189 100644 --- a/examples/intervention/intervention.py +++ b/examples/intervention/intervention.py @@ -13,54 +13,64 @@ system_message, use_tools, ) +from inspect_ai.solver._chain import chain from inspect_ai.tool import bash, computer, python from inspect_ai.util import input_screen +Mode = Literal["shell", "computer"] + @task -def intervention(mode: Literal["basic", "computer"] = "basic") -> Task: - return ( - Task( - solver=[ - system_prompt(), - user_prompt(), - use_tools([bash(), python()]), - agent_loop(), - ], - sandbox="docker", +def intervention(mode: Mode = "shell", approval: bool = False) -> Task: + if mode == "shell": + return Task( + solver=intervention_agent(mode), + sandbox=("docker", "shell/compose.yaml"), + approval="human" if approval else None, ) - if mode == "basic" - else Task( - solver=[ - system_prompt(), - user_prompt(), - use_tools([computer()]), - agent_loop(), - ], - sandbox=("docker", "computer-compose.yaml"), + else: + return Task( + solver=intervention_agent(mode), + sandbox=("docker", "computer/compose.yaml"), + approval="computer/approval.yaml" if approval else None, ) - ) -# TODO: Customize the prompt based on the mode above?? @solver -def system_prompt(): - SYSTEM_PROMPT = dedent(""" - You are an extremely capable general purpose agent. Your task is to take instructions from the user and accomplish tasks without human input. +def intervention_agent(mode: Mode) -> Solver: + return chain( + system_message(SHELL_PROMPT if mode == "shell" else COMPUTER_PROMPT), + user_prompt(), + use_tools([bash(), python()] if mode == "shell" else [computer()]), + agent_loop(), + ) + + +SHELL_PROMPT = dedent(""" + You are an extremely capable general purpose agent. Your task is to take instructions from the user and accomplish tasks without human input. - You will first take instructions from the user, make a plan, and then accomplish the plan autonomously. + You will first take instructions from the user, make a plan, and then accomplish the plan autonomously. - You are in a full Ubuntu environment connected to the internet. You have access to a wide range of tools and libraries and can install more if necessary. You do not need access to sudo to run apt-get or anything else. + You are in a full Ubuntu environment connected to the internet. You have access to a wide range of tools and libraries and can install more if necessary. You do not need access to sudo to run apt-get or anything else. + + Your "python" tool will execute a given script. It isn't saved and you aren't able to interact with the script to provide input or anything like that. Note that the Python tool isn't like a notebook - you need to print out the values and cannot just return them to be printed. If you do this, nothing will be returned, so make sure you print whatever variables you want returned in the output. + + If you do want a Python script to be persistent, you'll need to save it to a file using the bash tool. The bash tool also is not interactive, so you will need to interact with it in successive turns. + + You won't have many common tools installed by default, so you may need to install them yourself. + + Please reflect on what actions to take before you take them. + """) - Your "python" tool will execute a given script. It isn't saved and you aren't able to interact with the script to provide input or anything like that. Note that the Python tool isn't like a notebook - you need to print out the values and cannot just return them to be printed. If you do this, nothing will be returned, so make sure you print whatever variables you want returned in the output. +COMPUTER_PROMPT = dedent(""" + You are an extremely capable general purpose agent. Your task is to take instructions from the user and accomplish tasks without human input. - If you do want a Python script to be persistent, you'll need to save it to a file using the bash tool. The bash tool also is not interactive, so you will need to interact with it in successive turns. + You are in a full Ubuntu environment connected to the internet. - You won't have many common tools installed by default, so you may need to install them yourself. + Please reflect on what actions to take before you take them. - Please reflect on what actions to take before you take them. + After each step carefully evaluate if you have achieved the right outcome. Explicitly show your thinking: "I have evaluated step X..." If not correct, try again. Only when you confirm a step was executed correctly should you move on to the next one. """) - return system_message(SYSTEM_PROMPT) @solver diff --git a/examples/intervention/Dockerfile b/examples/intervention/shell/Dockerfile similarity index 100% rename from examples/intervention/Dockerfile rename to examples/intervention/shell/Dockerfile diff --git a/examples/intervention/compose.yaml b/examples/intervention/shell/compose.yaml similarity index 100% rename from examples/intervention/compose.yaml rename to examples/intervention/shell/compose.yaml From b7a6a06b2d4bb6b8e5f963555720d018f1fc87a1 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 14:20:36 -0500 Subject: [PATCH 22/41] docs on approval --- docs/approval.qmd | 25 +++++++++++++++++++++--- docs/tools.qmd | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/docs/approval.qmd b/docs/approval.qmd index 73af3f6d7..ad9af4909 100644 --- a/docs/approval.qmd +++ b/docs/approval.qmd @@ -33,13 +33,14 @@ You can chain to together the `human` and `auto` approvers in an *approval polic ``` yaml approvers: - name: human - tools: ["web_browser_click", "web_browser_type*"] + tools: ["web_browser_click", "web_browser_type"] - name: auto tools: "*" ``` -Navigational web browser tool calls (e.g. `web_browser_go`) are approved automatically via the catch-all `auto` approver at the end of the chain. Note that when listing an approver in a policy you indicate which tools it should handle using a glob or list of globs. + +Navigational web browser tool calls (e.g. `web_browser_go`) are approved automatically via the catch-all `auto` approver at the end of the chain. Note that when listing an approver in a policy you indicate which tools it should handle using a glob or list of globs. These globs are prefix matched so the `web_browser_type` glob matches both `web_browser_type` and `web_browser_type_submit`. To use this policy, pass the path to the policy YAML file as the approver. For example: @@ -47,6 +48,24 @@ To use this policy, pass the path to the policy YAML file as the approver. For e inspect eval browser.py --approval approval.yaml ``` +You can also match on tool arguments (for tools that dispatch many action types). For example, here is an approval policy for the [Computer Tool](tools.qmd#sec-computer) which allows typing and mouse movement but requires approval for key combos (e.g. Enter or a shortcut) and typing: + + +```{.yaml filename="approval.yaml"} +approvers: + - name: human + tools: + - computer(action='key' + - computer(action='left_click' + - computer(action='middle_click' + - computer(action='double_click' + + - name: auto + tools: "*" +``` + +Note that since this is a prefix match and there could be other arguments, we don't end the tool match pattern with a parentheses. + ## Approvers in Code We've demonstrated configuring approvers via a YAML approval policy file—you can also provide a policy directly in code (useful if it needs to be more dynamic). Here's a pure Python version of the example from the previous section: @@ -152,7 +171,7 @@ Assuming we have properly [registered our approver](extensions.qmd#sec-extension ``` yaml approvers: - name: evaltools/bash_allowlist - tools: "*bash*" + tools: "bash" allowed_commands: ["ls", "echo", "cat"] - name: human diff --git a/docs/tools.qmd b/docs/tools.qmd index 32aa773ec..0202dfc7c 100644 --- a/docs/tools.qmd +++ b/docs/tools.qmd @@ -446,6 +446,15 @@ services: image: inspect-computer-tool ``` +You can configure the container to not have Internet access as follows: + +``` {.yaml filename="compose.yaml"} +services: + default: + image: inspect-computer-tool + network_mode: none +``` + Note that if you'd like to be able to view the model's interactions with the computer desktop in realtime, you will need to also do some port mapping to enable a VNC connection with the container. See the [VNC Client](#vnc-client) section below for details on how to do this. ### Task Setup @@ -515,6 +524,46 @@ With ports configured, you can now connect to your running session using a VNC C ![](images/vnc-view-only.png){width="549"} +### Approval + +If the container you are using is connected to the Internet, you may want to configure human approval for a subset of computer tool actions. Here are the possible actions (specified using the `action` parameter to the `computer` tool): + +- `key`: Press a key or key-combination on the keyboard. +- `type`: Type a string of text on the keyboard. +- `cursor_position`: Get the current (x, y) pixel coordinate of the cursor on the screen. +- `mouse_move`: Move the cursor to a specified (x, y) pixel coordinate on the screen. +- Example: execute(action="mouse_move", coordinate=(100, 200)) +- `left_click`: Click the left mouse button. +- `left_click_drag`: Click and drag the cursor to a specified (x, y) pixel coordinate on the screen. +- `right_click`: Click the right mouse button. +- `middle_click`: Click the middle mouse button. +- `double_click`: Double-click the left mouse button. +- `screenshot`: Take a screenshot. + + +Here is an approval policy that requires approval for key combos (e.g. `Enter` or a shortcut) and mouse clicks: + +```{.yaml filename="approval.yaml"} +approvers: + - name: human + tools: + - computer(action='key' + - computer(action='left_click' + - computer(action='middle_click' + - computer(action='double_click' + + - name: auto + tools: "*" +``` + +Note that since this is a prefix match and there could be other arguments, we don't end the tool match pattern with a parentheses. + +You can apply this policy using the `--approval` commmand line option: + +```bash +inspect eval computer.py --approval approval.yaml +``` + ## Web Search {#sec-web-search} The `web_search()` tool provides models the ability to enhance their context window by performing a search. By default web searches retrieve 10 results from a provider, uses a model to determine if the contents is relevant then returns the top 3 relevant search results to the main model. Here is the definition of the `web_search()` function: From 8cd193e4f9dc459ef4d424eb0775b15c2e1bcabb Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 17:07:14 -0500 Subject: [PATCH 23/41] Iterate on the port mapping ui. --- examples/computer/compose.yaml | 2 +- .../_display/textual/widgets/port_mappings.py | 111 ++++++++++++++++++ .../_display/textual/widgets/samples.py | 18 +-- src/inspect_ai/_util/port_names.py | 61 ++++++++++ .../_tools/_computer/_resources/Dockerfile | 2 +- 5 files changed, 176 insertions(+), 18 deletions(-) create mode 100644 src/inspect_ai/_display/textual/widgets/port_mappings.py create mode 100644 src/inspect_ai/_util/port_names.py diff --git a/examples/computer/compose.yaml b/examples/computer/compose.yaml index 9ec3932bd..708a954c5 100644 --- a/examples/computer/compose.yaml +++ b/examples/computer/compose.yaml @@ -14,4 +14,4 @@ services: # the specific container by using `docker inspect ` ports: - "5900" - - "8080" + - "6080" diff --git a/src/inspect_ai/_display/textual/widgets/port_mappings.py b/src/inspect_ai/_display/textual/widgets/port_mappings.py new file mode 100644 index 000000000..d2dad2fee --- /dev/null +++ b/src/inspect_ai/_display/textual/widgets/port_mappings.py @@ -0,0 +1,111 @@ +from typing import Literal + +from textual.app import ComposeResult +from textual.widget import Widget +from textual.widgets import Link, Static + +from inspect_ai._util.port_names import get_service_by_port +from inspect_ai.util._sandbox.environment import PortMapping + + +class PortMappingsView(Widget): + DEFAULT_CSS = """ + PortMappingsView { + layout: grid; + height: auto; + grid-size: 4 3; + grid-columns: 1fr 1fr 1fr 4fr; + } + """ + + def __init__(self, ports: list[PortMapping] | None) -> None: + super().__init__() + self.ports = ports + + def compose(self) -> ComposeResult: + if not self.ports: + return + yield Static("service") + yield Static("container port") + yield Static("host port") + yield Static("url") + mappings_and_services = [ + (mapping, get_service_by_port(mapping.container_port, mapping.protocol)) + for mapping in self.ports + ] + print(f"self.ports {len(self.ports)} {len(mappings_and_services)}") + remaining_widgets = [ + widget + for mapping_and_service in mappings_and_services + for widget in widgets_from_port_mapping(mapping_and_service) + ] + print(f"remaining_widgets has {len(remaining_widgets)} entries") + for widget in remaining_widgets: + print(f"yielding {widget}") + yield widget + + +def widgets_for_port_mappings( + port_mappings: list[PortMapping] | None, +) -> list[Widget]: + if port_mappings is None: + return [] + return [ + static + for mapping in [ + (mapping, get_service_by_port(mapping.container_port, mapping.protocol)) + for mapping in port_mappings + ] + for static in widgets_from_port_mapping(mapping) + ] + + +def widgets_from_port_mapping( + mapping_service_tuple: tuple[PortMapping, str | None], +) -> list[Widget]: + port_mapping, service = mapping_service_tuple + return [ + widget + for host_mapping in port_mapping.mappings + for widget in get_row_widgets( + port_mapping.protocol, + host_mapping.host_port, + port_mapping.container_port, + service, + ) + ] + + +def get_row_widgets( + protocol: Literal["tcp", "udp"], + host_port: int, + container_port: int, + service: str | None, +) -> list[Widget]: + url = get_url( + host_port, + service, + ) + return [ + Static(service if service is not None else protocol), + Static(str(container_port)), + Static(str(host_port)), + Link(url) if url is not None else Static("asdf"), + ] + + +def get_url( + host_port: int, + service: str | None, +) -> str | None: + if service is not None: + if service == "noVNC": + return f"https://localhost:{host_port}" + + if service.startswith("HTTP"): + return f"https://localhost:{host_port}" + + if service.startswith("VNC"): + return f"vnc://localhost:{host_port}" + + return None diff --git a/src/inspect_ai/_display/textual/widgets/samples.py b/src/inspect_ai/_display/textual/widgets/samples.py index b4c2e53a9..7ad969326 100644 --- a/src/inspect_ai/_display/textual/widgets/samples.py +++ b/src/inspect_ai/_display/textual/widgets/samples.py @@ -11,11 +11,11 @@ from textual.widgets import Button, Collapsible, LoadingIndicator, OptionList, Static from textual.widgets.option_list import Option, Separator +from inspect_ai._display.textual.widgets.port_mappings import PortMappingsView from inspect_ai._util.format import format_progress_time from inspect_ai._util.registry import registry_unqualified_name from inspect_ai.log._samples import ActiveSample from inspect_ai.log._transcript import ToolEvent -from inspect_ai.util._sandbox.environment import PortMapping from .clock import Clock from .transcript import TranscriptView @@ -319,7 +319,7 @@ async def sync_sample(self, sample: ActiveSample) -> None: item for sandbox in sample.sandboxes.values() for item in [Static(sandbox.command)] - + create_port_mapping_statics(sandbox.ports) + + [PortMappingsView(sandbox.ports)] + [ Static( "[italic]Hold down Alt (or Option) to select text for copying[/italic]", @@ -333,20 +333,6 @@ async def sync_sample(self, sample: ActiveSample) -> None: self.display = False -def create_port_mapping_statics( - port_mappings: list[PortMapping] | None, -) -> list[Static]: - if port_mappings is None: - return [] - return [ - Static( - f"{host_mapping.host_ip}:{host_mapping.host_port} => {mapping.container_port}" - ) - for mapping in port_mappings - for host_mapping in mapping.mappings - ] - - class SampleToolbar(Horizontal): STATUS_GROUP = "status_group" TIMEOUT_TOOL_CALL = "timeout_tool_call" diff --git a/src/inspect_ai/_util/port_names.py b/src/inspect_ai/_util/port_names.py new file mode 100644 index 000000000..659a1ef08 --- /dev/null +++ b/src/inspect_ai/_util/port_names.py @@ -0,0 +1,61 @@ +from typing import Literal + + +def get_service_by_port(port: int, protocol: Literal["tcp", "udp"]) -> str | None: + """ + Returns the likely service running on a given port number. + + Args: + port (int): The port number to look up + protocol (str): Either 'tcp' or 'udp' (defaults to 'tcp') + + Returns: + str: Description of the likely service, or 'Unknown' if not found + """ + # Common port mappings based on IANA assignments and common usage + port_mappings = { + "tcp": { + 20: "FTP (Data)", + 21: "FTP (Control)", + 22: "SSH", + 23: "Telnet", + 25: "SMTP", + 53: "DNS", + 80: "HTTP", + 110: "POP3", + 143: "IMAP", + 443: "HTTPS", + 445: "Microsoft-DS (SMB)", + 587: "SMTP (Submission)", + 993: "IMAPS", + 995: "POP3S", + 1433: "Microsoft SQL Server", + 1521: "Oracle Database", + 3306: "MySQL", + 3389: "RDP (Remote Desktop)", + 5432: "PostgreSQL", + 5900: "VNC", + 5901: "VNC Display :1", + 5902: "VNC Display :2", + 6080: "noVNC", + 8080: "HTTP Alternate", + 8443: "HTTPS Alternate", + 27017: "MongoDB", + 27018: "MongoDB Shard", + 27019: "MongoDB Config Server", + }, + "udp": { + 53: "DNS", + 67: "DHCP Server", + 68: "DHCP Client", + 69: "TFTP", + 123: "NTP", + 161: "SNMP", + 162: "SNMP Trap", + 514: "Syslog", + 1194: "OpenVPN", + 5353: "mDNS", + }, + } + + return port_mappings.get(protocol, {}).get(port, None) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index 03f5839ef..0763afa52 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -69,7 +69,7 @@ COPY computer_tool/ /opt/computer_tool ENV PYTHONPATH=/opt EXPOSE 5900 -EXPOSE 8080 +EXPOSE 6080 ARG DISPLAY_NUM=1 ARG HEIGHT=768 From 10059928ece460cd274beaa0021231418984eacf Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 17:09:17 -0500 Subject: [PATCH 24/41] tweak docstring --- src/inspect_ai/_util/port_names.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inspect_ai/_util/port_names.py b/src/inspect_ai/_util/port_names.py index 659a1ef08..20cbb4a53 100644 --- a/src/inspect_ai/_util/port_names.py +++ b/src/inspect_ai/_util/port_names.py @@ -7,10 +7,10 @@ def get_service_by_port(port: int, protocol: Literal["tcp", "udp"]) -> str | Non Args: port (int): The port number to look up - protocol (str): Either 'tcp' or 'udp' (defaults to 'tcp') + protocol (str): Either 'tcp' or 'udp' Returns: - str: Description of the likely service, or 'Unknown' if not found + str: Description of the likely service, or None if not found """ # Common port mappings based on IANA assignments and common usage port_mappings = { From a00d8a0bdbd0b81f2c9d72568589065b5972f2cd Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Tue, 14 Jan 2025 20:49:41 -0500 Subject: [PATCH 25/41] docs on new vnc port mappings ui --- docs/images/vnc-port-info.png | Bin 0 -> 165338 bytes docs/tools.qmd | 25 +++++++------------- examples/intervention/computer/compose.yaml | 5 +++- 3 files changed, 13 insertions(+), 17 deletions(-) create mode 100644 docs/images/vnc-port-info.png diff --git a/docs/images/vnc-port-info.png b/docs/images/vnc-port-info.png new file mode 100644 index 0000000000000000000000000000000000000000..10fe961bb5973302c9b93d4bf7ec2fff27b60f25 GIT binary patch literal 165338 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Ν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�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ɦ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�o_(z@=($qnn-T!Pp`3$fXvis*;*rh#fH4;n46t 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

dq1+b>xp`TE zSIe_pby_hm#U0dTu)}-TDxCI%7=69~D6Y71l1Wxu?u{kMW<6?*7u%vFCm-DVF2P8# zXDK4B9Di;_lh2Y7wQ$6|$-W?u5E`$LZEe_gSR-|%*x@lV^JY>zqc|?(d+$Dr*F31^ z5&F{9egoi%P1Y!(x-b>krEjR-?8LwjXwj&K)JnEXNJby;@YhFtn(7{7Z7JJd@&50{ zUx-yPB+o><6jxEet5OQl6(^bZuf67bov^wrO0|DiV525wZsF$Tpzjgl z(-P`iLF6ZUF3A+pAv-)I)o_&}d!Q5CmhoPTs9^PQ)K zeyF&sq=ozLqk&pADjEPScXtA9%DeyO;Su@PjisE(;rK$4PMxlsqta-n`rO7@Qgy4C zg1C*iCH<)nkLBWv@QH|Yt)IFSJ8{w_B%!n$mqtzx_F@w-37)#0!w2tqHou(Zr`VC- zWzMbTf$6%TcKW2ljM|siSzceeRQG8MStLp{UtYqphsx4rCG;(e9oj);&@%qBkKArL za>?vUS*Z}OC7XQXW~iz}<#gmg5VJ?2CG7$I$LqAC57;wHa9zA56&r1L(cXP$sQ;LQ zez7H;{UPVQ6doM1f7E*OOJ`-6eJkQldw%#BGwgLw(6UcU4T*5tk_3(Z$~Y*c(Kug5 zZF(YPQVD{~6=@Hw^+i^E_wu7)a~x2Fh*nQ~6!I5e@IBgJsv;|N4yq};7GuV*ttK;1 z=zI74dz9BRvC+u=Ud5i+CAztwu@HAL>nG@`FUzdW#0t+CyH^pbW%I`+&h3I&y_j+& zoxvoHt8ZWTO6lU0j|Rqbcc_Eq>J)xfyC3Uwgr6y;Cd(pgs)Zi?cpGCFIKWBCiKjHr zCX@X^7k2wv6Ts0gE)Trj+8q?)y`&#%!opr!w{Xn|L{V}i$XP&$#nlPC7Dz>tJw2O< znw4ai$H1Q5+)gb|@ld~w`r@o^7rpCgLtVT(nxiP~2^tzwyg<{gIiM9 z5*jzzXIZo`A4`q9evSqBU7`3yrE#MJCFfRq3S`CCZZL4KF9mBPyNDr1K!Y=++^h2TmoY;+~H- z&M_U#uMvW`3@=OY8TU3HpQW)h@z_-i%zb8zIrqeT?9_%7 zD6#{adT_z2;YXr>O+Qj5ltM~OX0NY9Qy3l$CjyZT};<2H@?lqCtrT|mp2wjN1i4WHG`~|o6xnk z#}^qRYER-$dMQ{XR}7#ymM^uQU$4oY!*oek9~JXzps|MD%XclI=`(?{-_^d&sVhg~ z*k|H(Hk$~qAe%1Z=Vs6~+V)K{9oh@)Z#O+N&6;;WV`;pcKsbwMR$FXy^6L+BKGb+y zbKA+LE)w?7kil`*`$5guEK>#|_1+^AJg4d|znY48O+I-lh3$}uAI`VKd<-T(HN@HR zM*NW73uF2wznwU##qoTOD|~*eF`;{{Z2b~Rl+2!ffQD;af|}ZOCG!M|_p)n_V7q;7 z17dUaIcELomb3MrJ>!oV_L>Iiy&lMF?}_guT(XsxbdA=OwKAu zavbyV%y+sn;6BGcmcaiwqq;ruOgvwHo$1LRw`Q(PVc%q~%sU-r z``4TOwR%R7AE(+mX+I`1o11KBXzUJ>8zLu;**grJ{>Lf9o6knPz@OxF#vXk8%QW3Q8Tii^)m(H2fk?k%XZiHs9>?FVqdxLQ z$i4~exR1}@AN1d!1mX&Kj^!=uJ%9h=Z)a38M^gw2HDRtd_y0@J` Date: Tue, 14 Jan 2025 21:10:41 -0500 Subject: [PATCH 26/41] Put noVNC back in the image. --- .../_display/textual/widgets/port_mappings.py | 5 +---- .../_tools/_computer/_resources/Dockerfile | 7 +++++++ .../_resources/image_home_dir/entrypoint.sh | 1 + .../image_home_dir/novnc_startup.sh | 20 +++++++++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/novnc_startup.sh diff --git a/src/inspect_ai/_display/textual/widgets/port_mappings.py b/src/inspect_ai/_display/textual/widgets/port_mappings.py index d2dad2fee..446568386 100644 --- a/src/inspect_ai/_display/textual/widgets/port_mappings.py +++ b/src/inspect_ai/_display/textual/widgets/port_mappings.py @@ -33,15 +33,12 @@ def compose(self) -> ComposeResult: (mapping, get_service_by_port(mapping.container_port, mapping.protocol)) for mapping in self.ports ] - print(f"self.ports {len(self.ports)} {len(mappings_and_services)}") remaining_widgets = [ widget for mapping_and_service in mappings_and_services for widget in widgets_from_port_mapping(mapping_and_service) ] - print(f"remaining_widgets has {len(remaining_widgets)} entries") for widget in remaining_widgets: - print(f"yielding {widget}") yield widget @@ -100,7 +97,7 @@ def get_url( ) -> str | None: if service is not None: if service == "noVNC": - return f"https://localhost:{host_port}" + return f"http://localhost:{host_port}?view_only=true&autoconnect=true" if service.startswith("HTTP"): return f"https://localhost:{host_port}" diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index 0763afa52..ce6e6249e 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -22,6 +22,10 @@ RUN apt-get update && \ mutter \ # A VNC server for sharing X11 desktops. x11vnc \ + # A web based VNC client + novnc \ + # A WebSocket to TCP proxy/bridge for noVNC + websockify \ # Python reqs python3 \ python3-pip \ @@ -59,6 +63,9 @@ RUN echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers USER computeruse WORKDIR $HOME +# configure noVNC +RUN sudo ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html + # only reinstall if requirements.txt changes COPY computer_tool/requirements.txt /opt/computer_tool/requirements.txt RUN cd /opt/computer_tool && pip3 install --no-cache-dir -r requirements.txt diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh index bd20dde4f..427536b00 100755 --- a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh @@ -6,6 +6,7 @@ export DISPLAY=:${DISPLAY_NUM} ./tint2_startup.sh ./mutter_startup.sh ./x11vnc_startup.sh +./novnc_startup.sh # Keep the container running tail -f /dev/null diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/novnc_startup.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/novnc_startup.sh new file mode 100755 index 000000000..6acee6b4b --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/novnc_startup.sh @@ -0,0 +1,20 @@ +#!/bin/bash +echo "starting noVNC" + +# Start noVNC with explicit websocket settings +websockify \ + --web=/usr/share/novnc/ \ + 6080 localhost:5900 \ + > /tmp/novnc.log 2>&1 & + +# Wait for noVNC to start +timeout=10 +while [ $timeout -gt 0 ]; do + if netstat -tuln | grep -q ":6080 "; then + break + fi + sleep 1 + ((timeout--)) +done + +echo "noVNC started successfully" From e4a157cfb5b8952d35a30b36fbb48b68ab10826d Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Tue, 14 Jan 2025 21:21:00 -0500 Subject: [PATCH 27/41] tweak doc --- examples/computer/compose.yaml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/computer/compose.yaml b/examples/computer/compose.yaml index 708a954c5..4c3057516 100644 --- a/examples/computer/compose.yaml +++ b/examples/computer/compose.yaml @@ -8,10 +8,17 @@ services: # the following port mapping # ports: # - "5900:5900" + # - "6080:6080" # If you launch multiple containers, you can vnc into each container by using the - # following port mapping, but you will need to determine the host port number for - # the specific container by using `docker inspect ` + # following port mapping which will dynamically bind to host ports. The specific + # bindings can be found by using `docker inspect `. This + # info is included in Running Samples tab. The output will look something like: + # + # service container port host port url + # VNC 5900 61029 vnc://localhost:61029 + # noVNC 6080 61030 http://localhost:61030?view_only=true&autoconnect=true + ports: - "5900" - "6080" From c9ff17d1c60ec946654db0c623f6bee0af932660 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Wed, 15 Jan 2025 11:14:53 -0500 Subject: [PATCH 28/41] Update the port mappings style to conserve horizontal space and avoid wrapping. --- .../_display/textual/widgets/port_mappings.py | 12 +++++++----- src/inspect_ai/_display/textual/widgets/samples.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/inspect_ai/_display/textual/widgets/port_mappings.py b/src/inspect_ai/_display/textual/widgets/port_mappings.py index 446568386..8f585db82 100644 --- a/src/inspect_ai/_display/textual/widgets/port_mappings.py +++ b/src/inspect_ai/_display/textual/widgets/port_mappings.py @@ -1,6 +1,7 @@ from typing import Literal from textual.app import ComposeResult +from textual.containers import HorizontalScroll from textual.widget import Widget from textual.widgets import Link, Static @@ -8,13 +9,14 @@ from inspect_ai.util._sandbox.environment import PortMapping -class PortMappingsView(Widget): +class PortMappingsView(HorizontalScroll): DEFAULT_CSS = """ PortMappingsView { layout: grid; height: auto; grid-size: 4 3; - grid-columns: 1fr 1fr 1fr 4fr; + grid-columns: auto auto auto auto; + grid-gutter: 0 1; } """ @@ -26,9 +28,9 @@ def compose(self) -> ComposeResult: if not self.ports: return yield Static("service") - yield Static("container port") - yield Static("host port") - yield Static("url") + yield Static("sandbox") + yield Static("client") + yield Static("endpoint") mappings_and_services = [ (mapping, get_service_by_port(mapping.container_port, mapping.protocol)) for mapping in self.ports diff --git a/src/inspect_ai/_display/textual/widgets/samples.py b/src/inspect_ai/_display/textual/widgets/samples.py index 7ad969326..e73fbd4df 100644 --- a/src/inspect_ai/_display/textual/widgets/samples.py +++ b/src/inspect_ai/_display/textual/widgets/samples.py @@ -11,13 +11,13 @@ from textual.widgets import Button, Collapsible, LoadingIndicator, OptionList, Static from textual.widgets.option_list import Option, Separator -from inspect_ai._display.textual.widgets.port_mappings import PortMappingsView from inspect_ai._util.format import format_progress_time from inspect_ai._util.registry import registry_unqualified_name from inspect_ai.log._samples import ActiveSample from inspect_ai.log._transcript import ToolEvent from .clock import Clock +from .port_mappings import PortMappingsView from .transcript import TranscriptView From a518404cfc1463bfd428f0d0c71eb2ca2a875a3a Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Wed, 15 Jan 2025 11:15:31 -0500 Subject: [PATCH 29/41] reorder mutter and tint2 to dramatically speed up container startup --- .../_computer/_resources/image_home_dir/entrypoint.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh index 427536b00..f79b44d87 100755 --- a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh @@ -2,9 +2,14 @@ set -e export DISPLAY=:${DISPLAY_NUM} + +# remove marker files +rm -f /tmp/.X${DISPLAY_NUM}-lock +rm -f /tmp/mutter_started + ./xvfb_startup.sh -./tint2_startup.sh ./mutter_startup.sh +./tint2_startup.sh ./x11vnc_startup.sh ./novnc_startup.sh From 2716c0d66e98988a3c135bcf1e887feec0173485 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Wed, 15 Jan 2025 13:29:34 -0500 Subject: [PATCH 30/41] Add proper formatting for multiple containers. --- .../_display/textual/widgets/samples.py | 31 ++++++++-------- .../_display/textual/widgets/sandbox.py | 37 +++++++++++++++++++ 2 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 src/inspect_ai/_display/textual/widgets/sandbox.py diff --git a/src/inspect_ai/_display/textual/widgets/samples.py b/src/inspect_ai/_display/textual/widgets/samples.py index e73fbd4df..943b00cfb 100644 --- a/src/inspect_ai/_display/textual/widgets/samples.py +++ b/src/inspect_ai/_display/textual/widgets/samples.py @@ -17,7 +17,7 @@ from inspect_ai.log._transcript import ToolEvent from .clock import Clock -from .port_mappings import PortMappingsView +from .sandbox import SandboxView from .transcript import TranscriptView @@ -308,26 +308,27 @@ def compose(self) -> ComposeResult: async def sync_sample(self, sample: ActiveSample) -> None: if len(sample.sandboxes) > 0: + multiple_sandboxes = len(sample.sandboxes) > 1 self.display = True sandboxes_caption = cast(Static, self.query_one("#sandboxes-caption")) - sandboxes_caption.update("[bold]sandbox containers:[/bold]") + sandboxes_caption.update( + f"[bold]sandbox container{'s' if multiple_sandboxes else ''}:[/bold]" + ) sandboxes_list = self.query_one("#sandboxes-list") await sandboxes_list.remove_children() + await sandboxes_list.mount_all( - [ - item - for sandbox in sample.sandboxes.values() - for item in [Static(sandbox.command)] - + [PortMappingsView(sandbox.ports)] - + [ - Static( - "[italic]Hold down Alt (or Option) to select text for copying[/italic]", - classes="clipboard-message", - markup=True, - ), - ] - ] + SandboxView(connection, name if multiple_sandboxes else None) + for name, connection in sample.sandboxes.items() + ) + + await sandboxes_list.mount( + Static( + "[italic]Hold down Alt (or Option) to select text for copying[/italic]", + classes="clipboard-message", + markup=True, + ) ) else: self.display = False diff --git a/src/inspect_ai/_display/textual/widgets/sandbox.py b/src/inspect_ai/_display/textual/widgets/sandbox.py new file mode 100644 index 000000000..b7cd49dad --- /dev/null +++ b/src/inspect_ai/_display/textual/widgets/sandbox.py @@ -0,0 +1,37 @@ +from textual.app import ComposeResult +from textual.containers import Horizontal, Vertical +from textual.widgets import Static + +from inspect_ai.util._sandbox.environment import SandboxConnection + +from .port_mappings import PortMappingsView + + +class SandboxView(Vertical): + DEFAULT_CSS = """ + .indent { + width: 2; + } + .no_indent { + width: 0; + } + """ + + def __init__( + self, + connection: SandboxConnection, + name: str | None, # if None, no header or indent + ) -> None: + super().__init__() + self.sandbox_name = name + self.connection = connection + + def compose(self) -> ComposeResult: + if self.sandbox_name: + yield Static(self.sandbox_name) + with Horizontal(): + yield Static("", classes="indent" if self.sandbox_name else "no_indent") + with Vertical(): + yield Static(self.connection.command) + if self.connection.ports: + yield PortMappingsView(self.connection.ports) From 211b4cc38453b8c2ca56ba3c2070d9ef3f5531b2 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Wed, 15 Jan 2025 14:13:42 -0500 Subject: [PATCH 31/41] Replace gedit with VSCode in the image. --- .../tool/_tools/_computer/_resources/Dockerfile | 11 +++++++++-- .../.config/tint2/applications/code.desktop | 8 ++++++++ .../.config/tint2/applications/gedit.desktop | 8 -------- .../_resources/image_home_dir/.config/tint2/tint2rc | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) create mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop delete mode 100755 src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index ce6e6249e..42d3862c4 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -34,6 +34,10 @@ RUN apt-get update && \ net-tools \ # A versatile networking tool for debugging, port scanning, and more. netcat \ + # A utility for non-interactive download of files from the web. + wget \ + # Allows the use of HTTPS in APT repositories. + apt-transport-https \ # Adds tools like add-apt-repository for managing PPAs. software-properties-common && \ # Add PPA repository for Firefox @@ -43,8 +47,6 @@ RUN apt-get update && \ firefox-esr \ # A lightweight PDF viewer. xpdf \ - # A simple text editor. - gedit \ # A simple image viewer. xpaint \ # A lightweight taskbar for graphical desktops. @@ -63,6 +65,11 @@ RUN echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers USER computeruse WORKDIR $HOME +# install VS Code +RUN wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add - && \ + sudo add-apt-repository "deb https://packages.microsoft.com/repos/vscode stable main" && \ + sudo apt install -y code + # configure noVNC RUN sudo ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop new file mode 100755 index 000000000..a8ef853f0 --- /dev/null +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=VS Code +Comment=Open VS Code +Exec=code +Icon=/usr/share/code/resources/app/resources/linux/code.png +Terminal=false +Type=Application +Categories=TextEditor; diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop deleted file mode 100755 index d5af03f40..000000000 --- a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/gedit.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Gedit -Comment=Open gedit -Exec=gedit -Icon=text-editor-symbolic -Terminal=false -Type=Application -Categories=TextEditor; diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc index e62987609..cab44bc01 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc @@ -64,7 +64,7 @@ launcher_item_app = /home/computeruse/.config/tint2/applications/terminal.deskto launcher_item_app = /home/computeruse/.config/tint2/applications/firefox-custom.desktop launcher_item_app = /usr/share/applications/xpaint.desktop launcher_item_app = /usr/share/applications/xpdf.desktop -launcher_item_app = /home/computeruse/.config/tint2/applications/gedit.desktop +launcher_item_app = /home/computeruse/.config/tint2/applications/code.desktop launcher_item_app = /usr/share/applications/galculator.desktop #------------------------------------- From 93234559b84ad624eb1a6cccba5189ccf8ea3acf Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Wed, 15 Jan 2025 14:59:25 -0500 Subject: [PATCH 32/41] Configure firefox to skip first run UI. --- src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile | 6 ++++++ .../.config/tint2/applications/firefox-custom.desktop | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index 42d3862c4..7926924ce 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -73,6 +73,12 @@ RUN wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key # configure noVNC RUN sudo ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html +# configure Firefox to skip all 'first run' UI +RUN mkdir -p $HOME/.mozilla/firefox-esr/profile.default && \ + echo 'user_pref("browser.startup.homepage_override.mstone", "ignore");' >> $HOME/.mozilla/firefox-esr/profile.default/user.js && \ + echo 'user_pref("browser.aboutwelcome.enabled", false);' >> $HOME/.mozilla/firefox-esr/profile.default/user.js && \ + echo 'user_pref("datareporting.policy.firstRunURL", "");' >> $HOME/.mozilla/firefox-esr/profile.default/user.js + # only reinstall if requirements.txt changes COPY computer_tool/requirements.txt /opt/computer_tool/requirements.txt RUN cd /opt/computer_tool && pip3 install --no-cache-dir -r requirements.txt diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop index 948021262..123f09aa0 100755 --- a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop +++ b/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Name=Firefox Custom Comment=Open Firefox with custom URL -Exec=firefox-esr -new-window +Exec=firefox-esr -new-window -profile /home/computeruse/.mozilla/firefox-esr/profile.default Icon=firefox-esr Terminal=false Type=Application From 5262cffc154251b6862ab847c6ab025d8da02ec4 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Wed, 15 Jan 2025 15:15:22 -0500 Subject: [PATCH 33/41] minor doc tweaks --- docs/images/vnc-port-info.png | Bin 165338 -> 137100 bytes docs/tools.qmd | 12 +++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/images/vnc-port-info.png b/docs/images/vnc-port-info.png index 10fe961bb5973302c9b93d4bf7ec2fff27b60f25..0ca1b85de9fd1e10b43c1c1139493a21e943ed43 100644 GIT binary patch literal 137100 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 Ad;kCd literal 165338 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ΝbH&Je~HSq@<3iY2_H8Nj~;i1FjZwxA#y2MYwKDvEzF+tuUnkzU!_4 zl*lGp>epP&-L3nvJH<pKEq_IxbTBxY?@d&`Z^fpxyxStN1|EwGC;0dfBv(fM3 z9_L$1qrib{b(;q{Z?u58rAWOK)y;n zzbirbe=^M&ymXO~7MxkJkFK9ahICQ|z$O~Kt+(XCtHWYq)Zw>6m#Nv>PM;~kqhY7~ zWSy`~Z=zoP`^OiQ*OcJEwIFl|^hBVi^zl=nIVo zDP9*F@dI+fryb9a3KD3)c^x*y+%Km!OmOysCEL!%`FFUF<@<@wBE;y?KZ6kRLw2qf z?Lxhdn+77G`UP^Q_@z5a|6Eu$ZAlW&N{!{UdoDzEa9N@6o zKlF?#p+O4%nQgAgsWWE#yijjLM=?EWEca{sj>A?ee`)ipV&OYqd zQ|xwniS{ZxKL>~q%zK2{Eu-2{$aO1!oX$s}3 z2k_4NpTlm)L_E1EfBMHlaT_F(8&PnpigJa}EJh4Vf_c0rkum6~BI8_S>m z!?cd(0Q>}X8SD$$XSY&8Q?B;79I^9Oz5Nm}nCdRo_Mk56$7Ld-?6WxBRAn;61|Ps9 zQsnKGtF7l!)8S1hPjFd0+H-oWv4X_BLH>rjCP^UpK<6w-bRbf~V-K;&af15r?l!TN zgNSKN`kARst1W)=tcPV{Jv_>^L^Q{>2dr2jVp186m7F?I%L6GBAODnVpdBm2O;47} z%Rs(p7Uj|B@=W?;GiP!FzmFigrVM=t+@-r$WqIdbdDEUp6gY^-9?it+U?)aRw7jEE z)4ekVRpOyMS(T0U1q$c2#Ml4)@J9P$xPpz*@xdJNJ=|PI27!e&#&i&rqtrebO^_vY zT%0%-W3HnjWt4e73hNCR4Ohd3YqC*oMHeZ&<~0ns|(n!_b>*i!?)Q%>V(DWtgqu9 z_-lEWS>&kS(!r6X|GdQe^dtLX;UG!B!9!B|`y#{Jf(AOZ@^|xTE&0R5nLItoRE6@Q z!WT0EDov8TI7FDB&((qIx>NVq#~$x7t4QE}Y@p|Uw*E0^{4BcRcdp5iF~*Na{taTj zyffn=ml61%N&9CCVS()n7jEcTM+%O#&=C1!UDMmVEK*Ywn26;1Ys2~PMlXg<;xN=Z z;=RZHU(^1dm(Ym^+@;)sh9g&YWCsOHrqu80cIWmrvNtGK4`!Z=<}X+X18+%yS}fzg zUfh4~@D+{P1(u0feHqf?@Gnz_fM>w?&vMRDCF|_=qt-$Onj)dU~U!Mu#f%-#;G0 zM6RYQbn#hOSrMABbY2iX2?|QjeH}V1GBOYd!n(id`)Z*#Z-G!`N4(aoI8Q(C%{SS8 zAmFc>#VWLAk))amy<=z@CRGPOOin4IA&GS2#{dP1??_iW1Ks*uR}^Wah=YY$Jaim> zKQR3tBy&h+3kplHg_8&Od{G!L+Xtc2B999}U^qGA9bQQ%b&Ul_=Q(-_8slF3($07v+?2{BW?Gx-_jN?_U z_2Q2|rFqRc*YK#d>*-xo^lDt~f(sG_F5wY&bHpzmL>%QdP2m?wyV#bS!5n;mQ&Po%`R4*&ICg*`}8ZW|AyEI3J%jNBHtSWDOuTz z{eBo??^id1m@(lVU+uj+=LzX3!AGQhdu6EhGW2RCz|nHHo+9t-d{@XjG04{Kp7h9 zeX&)GHF52HmWDF&n5+&3eYzi^gYMnbx%TlruLW~-n$D|#g$ zyFA8v^5>?a7})=mPP>%xa_x$Ll+2+X(_#<%kkaZwo z8ag;AHNOT>I&WoWYJipbTA~x~O8Oa40tkcp(|8X2yjzd!1HnIszm42Wy|hVv8Z zE|YP7RCglr{Jq=lC(53l+t;?XVTrEaA?Ix{{@nzEM1kH=GIv}_7f;)<b;6 z3bEsY=#G0ICR+5-^PRZoDOAJj{TAO1awou{1zgCXg0yMXE8uGe9<`4gh5Q=*%&?q& zn8T5B?oWA5vM0Zd23!hx3H=h&9~1tn<#^G%@WoR z#<(DYv{W<0m80)Hx1x~%fWJNkLMFnCy~zP8=zYSKYLiHXMm#3REven*7EW>s3h8sN z{wUmpo1b|`PbEcsp6)+e%gX3)wh|SlejqG81Dr{ZnuadL!SCrJ{k7;VcpQK9uR;J^ zy`GJjDc2SS*tc~+HgSG2EJ^G`{s?9i0EC9;Vh9O?ysn3Fl$Rx6CylWD3=S!Fsi(+Z8ZT+p7))FJ%2Rd+t@F=%nAd#Bopo5M9?$A zA!VcKZl;Drmm`~>BTT+zrc%w7?K6vLpDD{Xbz` z0{W>q11*{BKJ3^RPOvw@+_jX4Jnv%X}l;ExbV1;73it6=22w*r@( z=96!KSWyi%%kK~c9*!(mx!lTTJ6j3`*7N6z6wtnj%mmKiQ;%N0OC-sOYK6l6;f&eXuJOZ& zM~_1+EsWto;f<=xmmNwjhl@A`_Y9oL-5YY;80FZZa+QMTxYTh;7FYLzRf?E|Y_z)| z(e;daj00KQW!+t$n6G4jJJ&wnJjyHL{b+iQE3_v^a3ECl1~d~E+<)XHI$f;U>A>f8 z2bD3*4{r`-_k42T-5i`yxgES8B6?pB$BsF#Sm{A^iGol`;ld zGk(lx7NkbJSZ~HnOr=M3Jn?7vWG2L&OUzZE;&)p{%-e`EGm;@SnxL_KR!SvRFJqWR zh;_hR;b%Hq>_bdVb|FQ)l*l+^J${m^7#%p~4L9I$ZJz=T$|8Tl=>_H45d=)><%os z;(Zj$Xa2-Gl>}%`p7F=cw^xmF7!ugh+Juw2BW$MogQHjjZ(Imuy(DmA>ErsS%h)E~9y>dF zD{R`e>Ip>243E%qBbC|LH9L=4Nu-?bP9NL7Hd(lm6K&?bGtcq@GAhhWlQp_#;6O!H zm9AhdgNFEnSxLZ+d^PvDN&Niv6Jt{^l{i!NU1?=|f`r;A?(bsDBKb_?D#6W48X6iV zgKj9Y13>5RdtYSXLeNEJzTU9&vnE?FbfoULq@-7nst z2sqVaWW4QYimP0KVQKHC#G_~1ZspO?d}_t5^#RvUj?guf1PgD$awTCX`xX_kp5-&S zCANszVSX}BT*X4*jg8XuE^&IOMD+c&bU;ab!A7Z zd&m5z`$}wtdkw-YA6?m5&(l61iu|kso)c@k6nY9)uebP5e-2Tr`mw%|`(Ggh3B2hL}5iY>xUMmi%|iH4JONB7qZtLZ%B zoo}t8bN}HB(*nVID09xT7tZ2k(3CJOq{Md@GZD@AskO z=r~MBtT zshUx%ZWP&IAMDWpQlX;P>E#2NMxZ9#nZv5P046e&qTBo=-e+<8%LJhyy_gw)o6 zygPe6s@>s8jfgdo#t}N;cfEbZ<$Yt{2>xzm49~VQnNmkei$1eel}TN$U;dfBNnT7`ybBP6uY=R=3dzr%6#*r6 zv={l)&sZQ$#2Hlv-rg3r1W86rNx66R^tR%nnO!?L5LwunH7ym{0+CAbVr?7!uJsBo zSCvs-5^5}lF^4U6JSzrd-@zoK116Yldw!CtpcYdmKevW7keQ%>KHaSYw(XCJ+41Wn z95EV`B=btrd{~sjC3-j~na$W#yJ@e~5A)s+r>|2vpOA)0D}P=plU$x_M>8e)j&axO z`+859Le=}FFiE+6mO@M?MC0FA@+R+&6A}(|H=jD5%au(PT$giFm%MI1I`rNf6;W<3 zDYKfsfUElGQ>S#YwwRr0Oz5jRibkGkX|K>AK(Ax=5G4`(TcyR|Q|Bmx^ERC-TmH>M zJgqc?%7+R)vb1)Q0uay$CecSKqjNB6{lW~gQIev3jd`-QUz@4P;gh4x-}oV!A%CZI zS{5~-k;urwEST*c=Q}32kzpFti zqcC61r7=?q=k}u+b$DxtQx?|D%^n{L&p{CnxY2ZDFB2Y%4%eL+n<|r5QWfLCJP0xU zYVTJ+9PaX29#1Cf7u)`>QSUDKP@^{2$qrTF!+!XHYwHz@+zq1+hiZgNM-6Ozz1>rO zzRNu9{OqS)frcdg9Z(IU5|@Am^^VELMd*$jaeLt4+(-1Yo$)N@?>?x}9kx1_O9uidY#kY8 zpCk$*2L5h44UpqD5;n6!bnnhd6&Im~T*h(N>elY5+j->)znt`zn%jf(EGwRyrC60q zz#ptD;2 z|FR#SNCY*Sb#f0&HU}MIUVA&E4Uz8N$?`(3XxxC;8bc9$c;&tkN&t#3`CJDg-&Q*J z0TOPQ&@XW+oAqw|p;!xsy8^P>k!&W9S^{WiEHjWQ%l!>Nzl;7pkH{AUt$VBoV@KI1 zqz=5Q)$*rxAIwFwS>O_)@l{1Kb(I}SM{{u1*X(`hyKbf5k;zgtVLnRy79}wY#F)#K ztpg-GqrDF~i&?=k0a63R2NtVsR>jPnZ<>)h5G*Mve^sl)(%9BmB9exWWed6q!w+c7 z!6vAy1x2JVL_&7bu$Wg}JJ}U0wP3VRWX=nH?qdL$c(-!SS+e+kF&zB?g^NA)U?Ld$Iq z++~@MnM#;=7Ws*ckyO#~AX{p5xTJSBEx#7GRr;l;*)c;k_&&$rTbT}V;W^1BHu;dz zXP-lR7KqlN%kf-)^R4;W(f!?Qoj|a=f5@}2#`jMu@z@+(r0iT8UVE z&v|bx%`)3L(_IPar^G#=3>51ml_SRlTsBUkvMKcIjsa*BOh{ zO1eVvZcO&Er^IGV^v@c3oJ?xt*hvrd!O`t~LQ)|3mFomZa)3uEHsC@XDgp|lR!g19 zFSP3{DS9GknJe*p+fLf=>D3I~T_WsW;$5^iv-*Dgd`~x_5 zhgi?`p^{!cndLn4=KT~#UD_C=ly84drB3q>fQ-|_j^J~=?}*<{X4Ym6i_n9`R598Y z-icf`KAF8luf2kAYa5XtQyPkYL=NY=`vIwhvz`DccbUj~Ua8>G0b)Ny;6WJ0aWyEx zNYu4_!NMb)*0cDZFK}oVTL9uA_nT*~#-f^|1_jt?pAA#8`6SMwJl`r_mDoOS$3u8X zp8R;IWUHr8eDcfU@H{5gsU;;i9hRL(OyG`e8Y8_n7&%a4(6NC&&7dT-?K&(pKc5u9 zHa1jK)o`Lxxsb2X^|*WWnZ=*;XX{V~!LJqvAXhpF@E#4OIEbnWmBK8OS^GxErtIR;B~(P*dI|l#Uk_;+9q+_J#KC% z7VN@U53P6DU_OM|7ocxGpo(q+afHBfk;Bi9J?U-8lXu>EB=&tjMkATP6{L^aM}%QM zF>N1=i4v7f=4P4ImKaiYI%jLwmD@hJ&K8*GsiyT-GtReJio74Du5w8NK|iEy5|2;l%R~qEX0Ri6P!R94p zJY*tg6$MW$=lvhn$-zaj9?)a3Mx!9I*6C3W_Lc0_)tkKvvnk}3gP;!AVBV!YJ_NV> zMgh0KkS)jyETUewljC?Ik-#X^B6LRpyGJJTr7=XSpSFe)tIWoUoRpv)V?)RmYc0rr zNeuZV#hAPh*16)Z!f!r^h75`*kv;*%k0IpDnZ?3+zp2Y(j_Vg~1A$T^X+boI)F2tN zovXgzV;$Qe2>s4&*#&#e&-sab3cz4GwaFY$e9{Z%N1(E7+cQ5UbiIoJ4PxGk=dzbh z2)YruhKvh(NiUS{!5a}86GHZ3xge$JJL<;ice#b=-j~`1A_oFJ#wMoWI+k6X>DdVh z4aILvLvC^vDh{d^Kgi?2KqP}ycpz#NV5R7HdsE2y5)#QtqUS_N*(qqx`7QRsJ;iFJ zlD~31FrH9i5ZF0EWIw1BaG27s&Q_<3<8DQN%d@r5fUZsSY|hPc#^ijOH+QC)(m8!3 z1ZY)VRBO}lf-J)jKVC{&O0@K%Z_|{a*tZ$u2Tk@#_&E$sXZ`ujzl9Y;klb zLf=zgg_j>tFyrr$_}$2>Mdi(7#7dI1x#OHQZ%s-?NBXiVok#$n%t!Ag4iC=f$5loG z_L8--RAMeUz0AxH)=#4$wWN$uXw=)Vs2;Z1?~*=0KY7Jo-~nrGx0Keln7(vW*oEvB zC(Lh>(s`g1QfuFr^HXD9hljD@S%h(bCC(!`vzl7sBXL9CeDhxzwp zG9_~@c zsQMAI2s2(H9Fi@?N=6c91~d~9DP%ea@sN7Hv3XUz=kkziPBl}C=hee3-gZtdU0na` zWg!*K*v%^Z>2#gEud(=gdxZW;^&8{5#H~x^UqGXMoj)U;pG>POcg9wBiF+fk->z0XBYE8es*f0ylsY(NMtCia*V#l%zOt=|_Rd{s*=u#0r{p z;||!TgEgoih?9As;xX)44vrM&kzuV&vAp(@y|?@gw&1$YFn32~pJ?X`WulCHTY6g) zFQcrB51)P7;>MoQzZW8-rN{XEs&@*FdcHK4)8pn!T8aArwUFDG) z-^4YrGrOZAnoa_OJm&$0hIU0hzp!!)L%nMc`xeIE1okqiAjr^u5>0X>K+mZBBJpbs z^MJrrR$CLPv#yKBu# zDnnm@KxFc~FwbrU6s^q$omfa3c8m2$s)19*DU__NlT^euw1z>R3uZv+>(`LVN8FH0 znq84s045n<6{g#sOZWFaco55q;40#PtUY7h6^k9tD8@_l(YjHMJK|#pwUbjdkRnUo zy`v%4+uKBa1O<)8@#@9BLwFlsoH}qg(#wbENnzyigxL8T{3@l+#lt?C8#sdHvZgdf zfap+0wZ!A-4nUoxBZ#XRHlfWBmIc#Ot7332jkrwAp7_ng|W0 zM|Zd0>WuEp*fnHc_=7}K)nmc}>fctPr8^EOR_Jh7Qf^Aje%D&PL)8>J{C+vEY?@q4 z8b0@LsG0O2at6o(h+JeLJk}Q{@(VF2TP>c+IaN5Z5nf!uvakD7X=bUbLtKq%A2qR? z0ienH&gYkTf#NhVmqV<;M!3+TYaKxtEZ8SO%TqmFrEiT|iHhF`a=Ke;PMfuC+ij>} z{Eg>dv^B9?x*w;RuVTwPliy{Ld%i!B$N;7232a0gg@#>kG)i;>&gY}EVVAuWw2axm}=tQY(uX913f;DA|pT`!vhIERj-tX zQ=u9M#CIh}WG_q0FQ}n8tt^Xvno#iY+vFu8B*=27Uj*Owyd6o=Y3EOG0z zulv(Lji9ufOsSrlp>OF#ZoA2u>PNB~(89anBD}8Jec}QHXNn&K5!7%=l6t9 z`Ip7sF=XaSP!!HT+LzLcP$JL4IHF6*5lKnOo{s0tN+*m0?Q9P)Zl$A$OQ4NdVBM~w z8Z@2{pZ%Ipam0?}i(~%g^<~g7An!-9upkPwd@t=25SA*rh{5mWIptRzE`>)tw92U4 zJXjo0CfRKi%TM`8&Hp?^m0hfrpB;7qqz~TOk|gxh9xXO}YtYd5sr%5RaQ0N8npM&3 z%{41rhf+2yA>NawpB#`zkzcCtUG-0~MDG;J?_SEIAf@R8V-qXW=T}}FjF%;;zCwA- z%F}C~0nLiANS-=Nn+(!X#x9P>Cmg~bk6PIMK|d^wpZU>38^Ow ze4Yi2PgW@&<)4BAcO4eT22(%(nKJ_-=3sKe7!u0&qBW}H->ckyS!(hd1!#O*o+{$? z)kC5V!sqQxSfIar>)jKe9|X1ghP}D-0kBt)6}Wh;vfqF6jRAuqoI3}cy{swEiwVF6 zgwkkF0&}OHKh;!60l2e{C-{%Oaua>Q7=qre2L88Lbdq1Oa*5SS884c_0^Bp|w24gJ ze_^K@Z9@T|CIOFI{?1I?w#1~5oa5_p&qPb26QN zZUWHloAcoLVY8KMo%xrhhJ`J!*0^G{#IsV?i2?a-eDMIrhxGSPw9cb~i0+_@);Vi2 zd=}7{hh_HUwdv&?)LE8~kSQnrP65mP>P=9Yg4$2O(TN;(_M9&Nh&fJNKh4N|0)8=P zXob!ja67}TXLgEJtEGuM%XS~|(12Aq4$kxk0@Jn0?yT7dXv-#Fn5Z zjwNYj=5;DpMf&ev0M;R?lR(X6=OZsoi5boxoMN(a6JylKA zBrGh-DR&E2m0g^x-eixUV>3i*SwkW<<(KNv7v0T#{n_TgJ;io>l&H_lA%Kr0&alOn zm5QK;^-$t>N$OOgL0mG;dB%LUH}QaRBQK4YqI`tx_Y>PT19np(2}zake812DhzARV z_u;Yl5~TCLtqfB00WBFqzq4Bn=dfGNbTTw78H#b*EMQL9v(*zW%2sfpK^mErfNK7E zXTIQxA_d~T0XdXjcpz#_15_^;2M;tzAZt|Yy9u%9h!Xv-r&a!wm>Hi?(Z`f53<8`Y zbcp+^&5f=iD>H6emD3}-rr@lR*9RG?=`RHP?&6Ynh1;XSg5+u;4W`RSXd>{)(}p=u z%O)M(w#E?25u-PC<)(yb`#)_s9^IPS3k@eYm+_$j51FVGNwY(04VjrA z+i*7yIFr@NvpI2HD?YJ;3Sx0e?DTK~_+1{t(2BH)-{-LUO7sP9{r-@m`k)TieIzES?~+B<`FlU zNzqFEH8gfff@~T9xhKOhpoeKs&6pS|$BUE229#501n%V2A|~=^I`t7wOLGdW zRY3jIgd3(TwEH6EFqqoU(9o3<%foD+&kYi^-6}ci=7}FEJfEr1)wT}zU=g!AZn#}3 z;eW;MXYm1yf!7ccBPxNXD@j-mD9PEuaN?=qx0dXixjXFF`2A$@Bln^N3REIQkfZrl z^p`BSIF3fr$iD0LvYy46yVrd6cGUTZkWFj}nJSsix>B^zyK`#fO8JAlR-R2sj~*8}%XzGY zi_ujQB-Kg}*3dtN&P1?sEr>bVl?NNrMr#wt&Xr7=_{*;QzByNo`+8v&y5r`wzCqtG z(#%6};B>GkgdGHwMpu&zbq+b22c;+DMq0 zJ=o{fu0p$fNQIg8aOToiWRNcyR@?R=F+8x8Tmg1VVns+!Gkbagbc)i`12#ZCl zp3-nbzfp+G!^&KFzck#<_Ox5^=?SD9KBb5bky8l`i@t2HUdT8UWx6h%Ezp0|%>yNO zNj03vxsaj%A~UMll{8ad4K=XzI$Z%+IN8$8rKuh8ZBP9I1(><~7=jw%0(T%;l<+4D zb$m5g5O(Mc(Qe2g%Hh1VbesEf66{&!U5krFubbmehd6Qqb9wut8VHNs0MPy7Kn6zp zNEgMtw941R<=Xca@B<#BCV`v?Lc{7Yv+532I9e2XX|Z1#0lLLYix2V&YDDP+ZGDJjb#^{unVHRI}ND+VL)+i4IcTo?_+KwC!&hN43N z86`(fQ0si|Z}X8ze59@S44dD47jV)l9DaKC;zVGLQ;4z~Ldcomo)3 zi=)k*F0@O!%PA=d4YDAYuRb^aRd_U14M5_FW{_*r$YWyG0!mgtuM$ycs_+-anrDn^eEE@rr1gMWBV{U!<-QW>oEM zwdIvo3-ov!xgbe=31a)u&we~dj8}gGhefBBo8OO>eQQIv1GhZR8pU)D2nxnu%Z&F& z$PrK9-YXWe1+$OCdp;EVxx3u)ap?+%C(YHKa?aITR+N1Yi)Z*`8itgd#u61)x7w#^ z`yM@KcPWY(Z_t_|e{*^izt-gEmyH%C`wM-OTd)V^+hjrc0b#fHAg{JU#)Tt&W7$?k z2*<)sW;j*vd+&Q9z~NH5CF1C?12}2Gmn}VR-m1)UeOnpWEVnphUUR|oZok6pH{4}z z=-ig1*@_~$QLSWi|RwWdLUv4u;}w%g%Sb0 zyMW)En9H#&F(hL4gvklpIU9za3iALxMTO=^Gp2kABb0=yL9~!-_@TgwW_v}Rn|sc~ zjrR5Ibry0`uR1||KVaBIaL;%{AG^oTP1I!McH;bl{(l5A%Vt3`ff>PWv;{t^u@+-2@w>uLSNeP9uSVraWI~M-BRSqmZz{Qb`-8Xg!tf%bpPOnZlu7hp6v9|*r>5* zb_ndo5LcQ#p>CgUyePW+ENUCe0T56Gp;eKBKe3baYF{R@FXD$G zO>jDy2vF`1I$sC0{#yZGCG<7i13{51>_t@X|04{zp}2!;Ktp)=?HY~)JV3Hh6T&k6 z)NUO}8~Et=px9hHm5dL53J@8mBy7YGPXv*v0|5r7_-!Fni0$h&Jcan_%^Yf0BUqC(m z@)e-aY~Jw~)iCfC6E7c3z&hOmzx;1i{NLY%&O`x`*9NEQlHtDw=5P3SIha=waMS^$ z_N(C}e;;l2?w^6U$WBg<5}ibE_{Lv-FVurlBP|u3Id&eD(zik3lJA2Jg7e=Ex{Les zvqQlK*ukC0(Vu*}x&PNx0A&dtA_0~EeiEVAB*28d{`wgzqD+$l{oU$at@TiUElrir zWh?0ft*wYKDJrhYr}x=jZOjz1zXIhoucOzFo_%yXf0|De!iWJZAW%2OmFb08 z&Fa=Ov(5T;$6^tKRu%L{^6Df=)T=(CwJt|qhPPO)gC;}JO+Dx&U^KFDkOi;)0BM^} z9X;gpb(cRO{$t8w{x1^TZ%sag1cFHx`K3hK_<)iW=X#5~$_XQb%QMXOQ4cMaM{Yqh z`m>8M@p$%VV8$W+T%9j7!LNk_&TM2xUj(`UG@eGWJ_-?$&3Z+$cA}(8#s3!1rtkwg zQ$kwx@E4uwS{xI}XMipYt6W7Swd@rhi-3#I7T7uWIoPS;&vq}agKHVC> ze=R$ro!f2j@2vzB#RLO*r(SH2^FOPN6iNnzd9`d&(R?YlL4OM{)xpV=?N{Nka+Ys0 zLsm#)pVG<3;T(PDKW6u=w=Iq+o%`-CKYs<9!uCAb9IUI#bC4*RxJuTreCg_K$a#)d z5SrfqZLc1ut|I8Yk|DdodBlUG%yXIe6fEeyE8fX*;>*ltd7|A;xLGM3Ky5jH@A!Mh zG3D}jp$c8fzV&P)C^uC8!YSr*cJmy=$O(u^B2r&W+Xr)5ixQK!cwC zVdQgOnReNR{WBYI^?ssFPEcj4bprCot}b2esA75SRj4|AHqPVGti%8@x%(%dY*#~` zOpn4zLCeH+5AfD)-ko!W?OhSTu|&(yvT{PiVK7EmFOI)$eNXWD@=>)E_oOCdB4_cqineP}ul(^#n&; z$4GV-9>PjyHHE1>oW|tWoj%cM8wF_8;TSR|q&rQUv0t|Mp9pToI5@llYmi`W{puNm4w9z%5~Tt?>7=7zWyLl zA~A*i>qD5zbANLw<=6JN66yjQ$j@FA6&!efGdlSxv%^TZnvB=xIG^{c;2%L{aI{~Zys``GbN1d zBxaBen(0m`QmMrc-*~vqEu!TaDO9JPKq3+X&7HWYA}kBYCRB# zpLFxfJ=#S|29E;ccF&!JT>F(eRmh-m*{7(xHc39(AEhW#abV9ikdkI_`I!QPtlXs@ zKUY4|^fs%8eryZ zRD@Gu{JEgvOsCfftP>N-@Tc@+QKsA=7N&>E|7=qqVw=y%qW&{i?H3T+gzy4o`UEiP zR0_YaSjCMtrIVmHCHWzIwDCod483Z7+oULQ7k}7A1-KcL$k7I;)OVT8z0J#5-m6R) zV*k*e9}jWN9Q{9l+6ystZqmbR-0FbUcXs|C-QnrqMa7iZn0joE3Cr1Tmg;oX{z1YN zX&g6H=`%h*67>yNZ4#%GdzySxuAJ>iIx>45Z%OKM`u4;az9cJ!WfLcNKx}e#@$>D} zo&=X`2<>vSVZ}^8T-Xd1wng_04t+EM5=9MrAj=OapVt|oZ*I0Ot#n{Y3nB|YcvLun zF8w25z(V9Cst5p_AtJW_A9({aB(@4d?_>Sf1R2q3L4iR;%s3M1`R=X66q#1?kfMKn zrW8dcf*{m@_buk@z*w~@rSv>W-N@6ej;oAhh!%THo%>4$oD!2!)#x|q$`fc(kJB49 z1_N>C<3~r)I$a44)4XIZBEI1rPR|o@&4dazg?|(BOP+jK&*~8PmkhlLmmh%V+)Q0VLV%W9BE|D?l@+vBBJZF3>!)ok2l8 z<#yu!M+-`BtC*M}L4#QOTaj1?7o(;35m%!>4-8R>0tEwQs2%cd-8*LAYm#w%zT;jv z-5-9Q?Z+&&9}x1ahi}65;qIJWv2pmSDV1p!w{S0Y-mCCbd}yy*q5IBPM@xV1*N8`T z{jNP6Wy1+xSq9y+_nACiu#0PciQ7@`jW%PcO!O|z_qnfA{(rbEPz#`!8>@@Y0&wb> zm~jcrAUw0_y$XUQ6={{a&-z~EihdZMKX4;pS%ms(kjK zl3sK@_A#0Hfb|4}jGdSU1>xc1tNo@S1LWy4`6^DU`1JWy%Emt}{QQb@{Oh6wWkGii zv;wayKDgk-luDY2>-qyu?ddkpbC2xl9kpEIUu1~)`lr*tACZxZvVgLIU{`0qYN5CF zW_Xj86EGWvMuhj|n>A?rfwdo(mC|0^6T|DFg&LwrNLpCZ+Kdrj+N_G~HN{8LBaR0O z{{LNxTFg^=<3DX%kv@)QZoLk&h!T>RhXi?;Eb|%P@yv_++n6@*{UYvEq0@NqEJ?4mtGYuVc%U^PY|f7o-`gT@?|QS)wXsQbRT|7eh?KkZY&H zXY_K00@$Y!8M*rRino>PGx)%lP$?4Lmz#Ycp#he$H3=*ub%Ms=hUW2izqQFe4|d}p zQy_CEdq;??RJSWqX>k~@e*IP_e?gGo2@i(DUrGbg=6`7-Bv}>!Zu$rY@#%k$Q#Qz* zU41z2D}(YjiK&WCsaxruHJZwJt7wy-HD7q`j0`WL0EG7zo{J82V2A}J=&&9Ei+&90d;m8#0}Li-vy|Z|Joegh)XkW zO{JYCa~evCP2eq2(d4~#x39Hb_8LVfn#e0}RpZQ|6^<@F@_%oDjho(-o)Gk(hjqvl z+|67nm493uOcpvgX~;-DolR%j^pHOcP3hx9Zufj1MKZgdm_DB+zy$7KsPS!@AHSq7 zv8{_Jjot8OdJyPOZ-dF78*df6`O+6{4bK)zV?Dn8@2Jm*2emlaAw_%1zn%vP#&=v~ z(79>EGM9|eQ)7MQnwvn*bGJRe#G?XIcD(u^s zVkMKW>)3hiqi2a+lC5EM4=@YVr5*`0eM+WsO+e--74b;5z4 zLfSRXIqc#`$$XuCp8TJ@g|C@(>dpxe!7>f|4;@~N zxPQGKeX2Wq_)jlsd&-_1CLOco0~uZVQ;`Wqn8_F4Adx8-koRch9C?+nC{75!{d-Qx zzjJ%AyY-OI9&-E-4xQ3KeYuu|#GySyZW20nuk~o7CrV`o-|A{>jiNJit7>L+IoM|3 zS@-f2HLe7ibtpwE+iw&w|6I96n0int(N^un!DfjLjL&e@h&?e|MI-HsjUbjmaR1+t zn8gMudzh1W9`gPzd-zg7LakonThVV9{Mm;2^a3g5W9?QOe6s*VsXzo*yW@;AX*K;d z{Cgo6+xMH>A9G(6&?`Xvuhe_Ar@t{-IXDJ&q;*M*damUZYpz)0_~Ulu>dkW28?^Ux z0~BxvoMV9qlUg0y!Dt?F`KT>0hI<@mh=KrHK0We?e-SQ_lFrDuX%}|V_EuX_!Li}x zA+tQ0;&M#ha_csykbkMEWbcb|4k6}O(%Pltb(^n$w+k<1j23w^6)AFe%@TFmu(FWi zV=+zcMqHRvWJIX{K5!pB3X&9mIML5&Xg(dZdUV)IP1{1Vt=U^VQ!s09)EOz#bJ{}A zcXp#PB-z5qSPLzm=qyF>CR9q1ditDx@u2ZJ8{_OSr9nVbVoa18XRt!%pf4QOa-eVS zBYn%-k*o89AVaINn4`IIYx8W1DyNC#LGgF^Q__DcOQ33N3n@me1tswQTjxyp6N?!{ z8H=$C%aHHbKP=)KY_rR5CoC(B30KnYg!BT?Tz_x8BpOr+G@W^cn8!q=>~NVi5puahd9sny}+Z4uw;DuqSMejuMgsHKW?rf;BS zk6h^bpIeJ~!pt%f|6lo%RtQ#xkVVf&(QfQ-ih~6GuDca;NcVr=8&dlwhm@VgJ$xEn z|Guq<5V*(i%PZTxKUPRv0$Cds$)JV*ih1BT@!^MH3xlx=4gXCFYC!^}i_GzlNXrun zbXaf||0mu5{_;N;$F_x30oP!fv7v0sbuJv z)Bi2<^8Z<&)Q11Jhy*$I{(cegmtr-zt9Ii^n#-Vnyi!&OfZ2Lr5TaY7{(pP|7V-&% zXV9F!e?RdH@LN3kiM0;#|KC561DHjH*2$Z zSyqfc?%mJEBn>8ul&aA zt?UoycvtIp8i1<#W`Hen{?Zqq1YhJxyg8Ori7^Lkv!|dGEqYUpZvzUSCIYAoe6T#I z_;6#0(olpk?G6Q0J8$zf*&OgZ_*KHots*W#^ED>Di7-jwnp{8CG0oWzzPv@)Snd_A zS_R){0b3%}qXj64*~NH3A#X@6AOK*nigaN%r%2>gvm$p64_yE8ayt(SP;)U0V8?|u zw%e=d^?acqe<7@XGST-s)LOv)+G)XjxbHIJ3E8N7x2R&39nSIL0wQ2GzxgU$`EWv2 zw~u6Xqq`daU#0)|8gAA?$N$|SNHH9<^0>?%;Ez+)KiD|GX>=)c=}<#@X33ZWOhE<~ za-@bBJoBa@;IKphB*5~rD=;i30C27Z?;>eC3BuhT!9&*hm1#{}5b&#P?$2km>Q82? zjBGX%)kK_}>P=eZv#dRvuN~&!Cz^rD3Fw4`7GgT~L+oFy7C6>3_+a3l`2>@C;bCH7 z(MjnFUai1%K4#m1O^mKchvlz0u|zUC_=zM-nl=Vv~U&9!@@w#SBDWF1+a|IkqQYZx3@e`aX(`Ow9J7PHQJ|qRF0d;5inbh$s_?Lo~sitFpBsu;|&j^7CA3^BEwxr+fPh2<# zA*3X*WAw}BymX{`_)s{$e|14#zdzU~W#HtTI{Sr|PzmB%Da*y6IFWcpm<+#hjSqC=`b$7Zj zjfpZ6H;@nLfIxu#m1|`o*8nc@3<%pjj;gRSvsC6_EDD|-dQ0uB*O;B^?*@-(nZ6%4 zL1)|9=SGSq4H$CQ-WMMvq1zFHXU~wd!_od2{vMS5bpJ%Ez#>-BXjlvE5$cc=fYXLL~XJ0*y zTD~_SFhTyFOrR-M&K;y6w#{oOl^(X|X+kryA7c$%J{j&+&#isCMqq=edjw*$Hyb@= z)o*`su3DI;@XG)G5CgJdr$C(M^)vy|`uzfj5NL6Ppc@fIrDZ>VYc#=6jz!vL4ns<4gt>S z5#_SD^Sw^SJ9;|6F2`%R2eLX5pSLn*ES4|B*p-R?l>dC50&na}{hmw_>{GcsU1}KQ z`B8%}#dbYTKpKAI01<}BQsHU>j0`AgQ#3-3XBYc(qDu2>5Lalx~|PTBZ}hF&`=O*F|# z|CD>TzhaxI6@FCQ5j~=K=$6NQ5SOl}kM+hBDNA(RL~*if$UE=x;Y5lYpv{*AM~$;N zrPyv8@Wiumi-iA~efwQ>c`Lw*1USJ|B$=}|d^}UqivNQ-+0&pf^SJn=_||Taw&6C> zSu|oaKEnEVB(p1x~pmtQIn3UGYpUzQLSgGp5V$B_p zVx3O=_wCiOGyYv-h@jeKa0F(Q7?=vD^K>YUGq~AtuPc?+>`A_IUnJpE*(3%f~u9ax@DHj5>sQ06<`u4at5*%8VG5E|*E(pI}lOm-_`nnMMt~B02WL2d9Q5r?fJx ziK1U5`Jz*(MJ;Z_pSiyPKnA`?KUK0&i_<}#AP*10&E=((fFT$+sUxegF{RfAkeUe+ zvOp94RTZDZcFbht{g@;v)XjaU9YDZ8okUJgPJT+rVflp3Z@0JU zKo3AZOwwYwdc4;7zOrZlDJYL)asBiLu7<Fup@PjY5*W@X*M^TIiDsvhCj*_2nWFd0dYcG=?ks^lRm(RZzQWi7M3_ zRm=#1J7!`T?p#WSmNow;k(pSA?Ix82fdTHEbN$y?%f3b$?rl6oKv(Rnx%ZUUyzdj+ z>=*rN4DTJ!N*Te7EXDj>qn`e-$$^jT;}8RU@vi}f>WgYYvkIIJLN%b|G&!(YkTRrP z)gP=uZ@dg~nzvR*l%4&e^O2TmGLsl6;h^r%ZZ|l)gdyu}UO3v^DHfd3G#sMhl!|r6 z4(ixQ;hl9mYXOCxE-&fNd?r=)OXRYN7OzhO1%X5zR$<+|C`uKHcyISNSKBxS8eU|l za=rZ;)8cDo9u#J4NCv@AAfb92<@Ss`upEaEhYd(5M4tG$e%{Qz{-9F7m z>TKda?OUk@5_b;Qb{3er5xR^J?ln@Jv?qxaxs(rms3x6bFz)(Cn>fBDuh;f3M&t&0 z)0vtZRmw4tBNr}%N|dVB9K_hU+;0NDEZM6JZlHX5ymXWh9K}-WDCWXRqWt#TLD6nc zWk-+{OlGb}3Sp=Gs`UE#5@2w@;v^U}FF(xmywJGX zNY-o3VQk(ecR3bki(6lkkPA5Q*i1Fkzi}9`)vt_LGX=9DF~cF;S(vCI`fvM+`F-Fs z)~NNKM+M$Sy%A89oA*r+3JF11?L6i6?eZfkfCLtIl-aSa0SN0!7$6>(Zloe=SBhK} zsFV5h>SlV~n9rHA9%m#aQFA^i7H#~3hW|RiI?_T$21zc3`D>$~<1Y5u_Sm;ZHU2+O z#h%l+JUeMcOXEWhEMLi`F#jbWh_W-?q^59EtnCY+@2J#RQ*3kWJ87%{>O7nQPk&5` zq$+jl!ZaZuHFzC=i>+3W*ESavMq6B`pD4*eAcQuyawQg;ZLhJFO z$b8qL5(%02iv%DhrHi-HYkR^`u<?{RCdSf%`M#4tteYb{X6zmJ9j&2vg6F`Kc? zXsMXBkiyY3&{=9-3TTPG2~nOV7dTx-n-Aqb{pcQkpd?hjnBS=+&L?XH&20q#)v>jO zu8t3N1v*cWbE+}}j6eZ_0G0})yiq!WrlM?Lzby5f|B50(Nx^;KXEI?){GiLx-`+M6 z1H$yD(Z`^^h~KTOh5GY--kgUApg`Hh)}mKlaylA5V-vO(Hg4 zQfw^QURX#-rvveNq=x!$thyDE*!P3Z^8ttL>8?ZkrKMrUHvZnBtRtfSqbG1OIk zV+$mSo5pp$1MuvnFU->)d0diZ9L$q; zvw9xroo^``i-Qlr^AZH~3*>JeuSdMQvV{GA*?T?Qxi%dK(l7!QAFA~!L3xCakicZ8 z{_T+D9)b1m`}0cgM2X_m6g3Qbb?^4>C0DZI%Lp|SP{3o&tCbp0rQD27$$a(Qg?xU9 zUIs*%DLg1}t4_gXMwbORU!0~JbkC39j7frk&~`~AF3&IK*8s00v>mEh*WsH1GK($h zOnEM{P1W4bDDxKqpgA48QJ!*>NTwu(c{LjZX5)(P$_-=11y2aLN*7EGZB5vq+C+kI zqZlNFwFln$W$x3Bk54dT-gjauy!(~TgUBrs#^HG_mo4ye!0GmTFI0tAhv#o?sS_MA zUMtQrSZYfkNx^)w{||`3Mm=WVlvDpKUQt}?ZRQX!#o3n*eKD*t87P-7YAvY|wbIlV zlwbHew(c<=AQ|N55>rkY`7()+v{iz##FV7^vTu5t0l+O|D7>d)?gnC0(i z?>o_(W3;KAfE3Qx$kA_!_kosRJiRk|@>3F*CyHIk+DAXzRwFt2B<8(<%q889jI9Hx z(j6%^lSp%_)QDC{$5Y$Yz)UFwba5Y$mf(pLyCgJo^0G}!!#43ar9?@oo~>W4a22Df zF0Oc_aN8FUFesR3&67L0tU>i1gPB`Fhf6I3%!@=>Rmo6yg|ies#(e2XKv`Jw*WJgd z5}XKP-gg%$TLLAEB}%zL+BG3D?|2UbQfA5(I5Vwz>6Srk#+1K4g~E*VjqP2DB`uSV z2Efvdwv=FI)5a#X33|sTQsSw;mZjQ^UD;(jlgLK8ac=Q4$m4zeT>$ef%=m zZhfdQS|keM)AFEXB!nf84`~2f4ePKOPLIQ7ZqE7LK4&5 zorD6Jy7zcC6Idrs_pQ?P2S;4#nXS4D-j$=Xzabq18BS2wxW)HQloQ7!LY&e^b*y;H z^ODXi!6$>uHirQ|zekCOh&c9F$$SdV%XdOR-Ao^pn}UXoCe5Nh=qoDl$9>rbgrWTL zA-DO^Q3+{#%FceJ^wk%efDG?etPH)^`_KWI4E$^zBI6{}Z%28kB-k;hB*?72G|60u zJk|ErP(Zz{w%E@Jmc*Umv50oSnUqg!!Hbe6K_bDMmA%SpUir)xt8}`fG>t?`RIXJ&K~X${T*hiDy-K z@_qFK3b=@(vkygLh1Yoev6LDu;|4pwSgPNgjlD7E$He^u_bARw#$l<%EbyH~3MfC- zjx~b){f&6)O;+u)bar!*<(!=&e??UCE<(+(%nt*dVK#50_jB3E(igXxuiT{Mj#~lF z=3EcRHll9_^c{bDs{iwfv(xf39&cXS2n*h4GFlLJWg_!6HSadi+bMO3*ahdTH^xh?TQVo`ZO}ql>8&_ny0nSTCoZ0&x?*(qbV@T zcW;DaRG(v>wpF?-{WTlsqPNrV9q4u%+_z>9j`g;sKNuLMU$4O@|LMXR zk4W3sWZUH)L-7GYnDq8#(Kb|gE$92M*bI6_3m`Zm8U_{Md=0a|SS=`Q0W*=c3clw&UXB^1iB^I<#rBuEv*L)qW zV5KJVW)eaQ0LN$zUypxzE%_!3(G2^iWEzDGwn;{V z&$|%C`oif*ua<-ES_kr{R$SUnb0&C{#8{^RVpkPnIkyuNZOT%`CfYH|KsRqz=H`V6 zbY#@p+f+OSx1PUEpsz2~+3m^q7h08Xt`&}jpG5xDz~2`abxaS;(C4cP8D_w*+znW! z==I!c4m5o85;>Ch;*?x-iaT$YSOOY1lDi(rNvS|_060nh8~==%MWzULHx3T-jGfJw z0=bGFnkB4ylgHmO7_Tmft1xP3w%G`7ETOX=(}zCCjbpTf401!^jf7!JYb#JG&x$iTdZLhM-%$dI=+&b5LDr#JM2{cJN6ABvf{isk;|r(Gq@h zi43s6*-$fn2nQ3oG#UhVCpKpX7h2oM7w?5LB0=(@39G{9ra(g6_qo16Wg22J#K94M z0lnqFh$szp5_zb*u(XWD2PJ#Ekux*9R+&VL{8kr=({ zQ1bHxBJUBp&AmyPbm?>wSe>2}Nt^FmOBVNkVWN)Eq&jZy2A&)TgE|@^yV&5zf55T@ zmO?yxQ;vNh4EoXZUo8Zn(2G7Sd8iiU74`+AlvIw!n zZ?^+$GvH&5;hiIhUjNQB|J&R!#3!rwfMePqL?fxgq+qyS?!)v7%WGXnIGmA zuhKD3**MglL1xd^86LMUm5|%ATT=Q9M*(^z^vP5NX#0GAVF|C^H(jk zywsHC4(|>&f{5#`I#*$CsRJs^L`TVNFT* zJh-541525nLNOUUi1R`0y9UN7o@CJWw&+q=O7zE3Z5dS~H}c4pNLMEM`<6}9LKHaHi@3Y<_Yv#F^Sj~)w4y!NzLbk z8~9KXOC;Rz{U?XiUQ1+OopmjHC`lg!J!Q?fcX=mb{00V7r@jq$DD-OOn{_+y6NiaR zY4m6p%qu$BmgC73-I8D60uCOPLz{Elm!f((1R8S9d+Cf@ip?GVjgc6-L_Ku1c^@u% zOKS%7dd__wU^nf=Yt2iY7TMMl7uDPo0-hSypFS;21Mpa&vAZXJne`$djy5k;3Grdr zzCUu}N_5A5z&=87c*Elkt9|iN3+<)Xt#XjYebt2EAb^4|uJ}3rD|ypM6@ID54bZtI z@Y<|rT5x}#+G zgH%lXecFItZ2l*FiW9%5{bZD3G3v5!-Xvy=#kG)a-s9gwB7c;Ak9mYnnb0dq{;8tM z`F$yx=8{X@H|qh77c=m6tpG^2Ssrqr@9MY)By&P9K*>qrU2cY{;vN;Be;ujnY8I5j zXF{pg9MSb}rlJ}2EYZflK-**6M0?h9U(E{nHk=0f>T}MR+En%~!&E0*?Bx3pm(eWY z56XRBknEM)dL{6gar8H9FYgiBO(4R~80I@M)+bPcFPt0Z|It&^lv!2)>_u*mq#N3C zRh0E!7}EfZ~P+YHTM$y^xvY0e*|1({Y>zBcx#9L0(w7$nY>jI537Dp z>XTxkOZh|@Of9KRq#A}P4mTUA0?9}az_QCi(o|K9VB8eMC?Hj zbV*eZ1l?wj8ar({R-p7?%h#SK+kQ07PMDJxKk+dGP;eG)B+N|IRz>V+k-GWn1AB!% zJAywD*R~vDQajZBy|;fL&Jc;lOxNE)s72`ZB17i^XkyPx`Yq5efXVGB-!f?VqfJtX zV}H}zN*Gv&xK83M)tD*RI|_~On%X&oQQGJj7*Ov51gym%!&R#pfRu%uU3IoKyrWF~ zs(2=Rh!0SxLQ>QuB_^PIBRjyELgiqG7pl2!X#f%%9GLC1-#6^zDW$^iU0Z zGf~@Zfn@6^e=3-(4NMbesw;(hu6ctre)@4k-MXHN@}PPem>7-rF`J;eA#zfvmZ z8rbhF3Ob=_v3x8U#J`m;!YW=q!Q(D*wha2z@+9|`{3%YkHnXTHVW|j;>K;du(MV%2 zNd;>SUqRX&34+qVT-RMP3v_73^BF7YoK*HUrltu-5h4fDaV#6pPKEn5!Ct*E1}KiRt?G%H_MX z{ht{)YR>W)DR6lPmr-Rx1{xENr6WqtK`{kX3lgsi9ZSSp7&FR`59_T@bAN4PjnpXB z^m>q&ZYns&AGDu1>4lJ!A&od~ZdkyaV&Z8bJ!o+l^ca&}oJF9&Kg%p67^6dbrq4;U#_ z_lJ66Q&cGrxm8ce9h=c|!A^!@@@H`0P+XgTJyT3qb7rg9LwZ#N%@Eaxmn_2@X+ecj zf$*z=CsI>>Z-ppJE#iT8KH2-;;|Q+ZLm;=HakO1q-nX6|!$s?bpFl1@iP-Xvi#6OPE%gl^ z_N1og#+~_V_rX44jkUE!0ScDEb9}Y_Ba9!o!4F&R){9TyHXSv4%H?ZYpG{b$-2ywJ z6fzL#XZPvhELANvwZD3$Xn+$Yj%sj?ilOJfCrX0+T|`KHd$uaKv$`3~1-#(;zU7|PRJlICD>wNi=swT@o1v<#m}8sy^f-j9sYrh5(`Z8g>FyaznC?GzN8E7BK+7& z1{uuT|K%_!2F;0}6P*=R|5^~}YeinvKNU?u1C~Vwy-EbdM6zO})z|5`?(fjS9L*A} zdSp@AMy=;@3|BqtBQCJ&Od_yl@G2~s&{~RekOHmj)PO(I2QFlasVQ=$1NzMh=;B}u z#t6-VAtc(K=Tp^yC2YZ6iF*=iI+7(<;^z#pGEq_t*h=5seD1Hd-qEIbQC4?ftl1EYU*oG>rTNO8sP+X-8Ok2J z1&wU`qXY-xOLbVe^^ZolHw+pj5&Wo_M2m3#&Q{Ch@dBRWP9GN-A{QK!-z_QBZTQWH zYYxBr?%gEvB7LvNk#My+o6h8}$C-D}%>szD4PS4vYOpxlX?qhk98j0LeKuWB9!V#+ z@91|er!a?_Ii>wf`TpvQMGG5MjhcDUVC)zg7x^`kID2S5?0NrTax=VpX#jhuZNE_IPF*8 zua6g1*jnY0(HIEqU(*e!R3;Z`^PG2dHD744dDh-p>av*^X;y}&nm7fXb7$_GAf8xc z9_yUBpSD>pjk{{T>9V4qp*fo27F5IZGlfQs5sIaP82+f}Gf$ub&c{NmK{hJXJtod$ zHjZ}Vd5LF38&-LTm^;v;oQS(RY+(A0kB)us*ltbTYNRs@#yaam_s#vDZ z@-iyEKP7)VQ60*jeuAFg=FY zy~4)bq*;d(-t;bgZ_}-p!2@V3<2DYB`LyEkM)= zn{kIa!G$v**(#nEo0S|5)Hjl>dISLix)v`U**6p~gLcF7`OUt2#|$*LUp>*vp785j zu}lVeEJQ@m72fM&{GD9#H)kgOuLU-jM$fj_2O}c9tX1mojdRkPHGaHXxrC|ZygpSk zIo-{-?N=J;QSA1jf&=m20}KmhiD2y8A_SlOta~zs`NzEa2J^wJLj|9SSpufce6gT*0Ty12y>x z!=}LwD%k=l7!6JKc-1FZwz6Mfu&UT-?VD-LDa7V}I>c#(=D4bEHHhoi@b5$fX6 zTOc#^9ZP}FV11H_@2*$ycP9*o{B!qiToDG?SDcjg-|Qi3ljk#fnQvfwxxen}mM`mA zxHaf51xH(ioc>lj@}m2VeENyBRX=eTY2;JA!8dq(K9?`|6I@Fr%+aUaUCpUT1|yX^ zEl$(QOM;sKdl4_}50BW3!Q^mv-vP9c_QOM7n;5?HI&@v_fivaidvIyRd1gwa{}~<9 zyw(7-yR=k3aelPEkM(D*Xqk}beKTDVsX=Kv@ZBF;`bqod{Uv4VWD`I?##gMaFn)-@ zQZUsy@(Z2UowQTB-MPTOb*U-|x1`a0Ng2T$Jrd(R9oA89+$XM-;#{b*9(?u1dxA0Wi>HE~zIHfX~vWH)Si?4o1X`-Tt?-X7nFX%&CMe&NF zT1@p*!#6eA$?nWkg~B@2rRZ^3_ze;YPQKbbaK^W(Q>k3;=ABOGZ*ls*_)##qPH=dP z_Tyf&s)+IEJ~30x+>ZN(r*gFe_i049^VqM=(<8}0CJWSzYQy*5u`y9DCS!Ox>vJ_! zz*JtC7QWYUDR^Wy4{#OmE>-efP;p7B)EsE+!^fV%HKmVu{H?c1wPdw9r=&fd!g6&u z;0(Pm@tt`qdH5VNaA1|#O*Z~wscp_+Ud{5j%eLQneb70ha&f!Ua}e8NzCAdBc_!wT z;SD877CcY9((jruxn4w2LSfRLz|syD+92w)s3Uw?X!zI=Zq@Zhs``l%X%6}#l2A+_ za`GZ-(Q}dRTJs6M=WGD^TH$DcHGMA9;dKv-dtkE!vv(s08xn@zJnG!I))^ksh0bgQ z&FJoQxM=P<5X?`bF4XX0N``>#y?)O)sn^xl<~BsFjO#FJUjfe>sdOGkV*pC123ZPU zFnV2E(ZCcg!=07Sh;x{Wl+qxYS&~DTe^PF^O^@2 zvLAk6Kc4>dJ$XAdvg>iiz-P zmY(l;RKtH*yYH_yl?~Tq)S}`8Z~f=>-4Pml)1KJe^kp8iw-0C8)Z=O96q6U=WnHaV5MF_-u2e37xV8`g`kgNzhoVd^;TXn@zxW_?)Lg+|M!Dp2!dh?(~5s_ zc#eGP>mJ5mnw<(X2Zx}x#;Hskj{7QZV<1_Qen15BiI@oRn~WV&B>w%*|9ta5e~Lry zB8U5s&*IPb^?ins#hghtY8mwBF0-VtxDL=1uy;?F>t1=iDZ|VkkO_^;kIQhLw3B{m zLJr~rT4>SC4qg=jQ*yBW&5-q9s@h78e}WkE1kuP1kDc1k)`@dhU*a`Up`Y^qR zaev;6%>Y&qdD^9_;s52$F^J$lS%p)rz(v6eTLb(ve1G(`Tl(MC{BK#MUXVc{og$8P z)9@X4V=04J<9fv(%@|D7JH{93hM?o?qrUn-9mtc87fJXom&D_^`yI>{Vx7R#A_L!G z5|+emo2(dgfguS#WPq25XN7@$RF?;y%%JGs1#A+{5>JlLle-S9HrOE7sCjRCsPaSe zwM3Ro`nNod;Geb!gF=V2a-JrL~_y|T+pi!E-9D#C60+{S43($)BF2`%Sd+rze zv0(Ps0MOTE0{Fn+YfXRd%m7giNV&@-G0*`(aH1?z8=Ga7|EEfzRc5zf)gTS9Fjj&Y zK(-g3#Zau`EVRp`LjR23e6%{ZcH6^`Uzgdou}q%4`KI#V5-rEX4yeUoYzs&trq4MHzy0WW?fBi|DQ0?G*p!9r$mzp-BM$tkEW2`e ziBA5>0hZPE=aDh(UEo~xQWG@pzEi%i**%iNnS z8U{f>qB+C1d{u|%g{tw)#jDphLmj>O#6MSExN~He8(qZqe^#lsKa9lNns3mnJr5B& zWM3JnwR>Po<=-^&t`#$9s=$=U6Mw=qN3T+xQ5)66+WVucU$1vV`kaS%H^4sMEBwOt z99DdPK8Y%K`6lhn4~M3#2WCcz7dlWia)I>YTjRV|CiZzW6HGWWTx^CSFPIihj`Op1QXeXVB;DH>|W=C5g|gXweiIx zFqvpoP>z|B_ymR=;CYCVg&fXLP5{=azR7?^5KMl@mg%kDqzQLLIMu4Rj5VJq=m&#* zO~A~{@mxtX?#&dVJdf*>`fmWb8wc{qD_dXWT7m5COQ-l($gY0+JcG>%w4VRgME;g zfYSd+BXuf{`i??)JEu_t8{?~~y)x6>B;}UlSljdWVu?JFt;w+A1(8YOZzbpQI zYzP&=HnNsv;niv1;bVVJ!D8xAlSzEVbbIkYuGfBIvmI5ae3)nPXlTZbgKO{;jcy;Z zTek~Cd+TzZkY}Z>)+tlcmA}3$6P%#Vh>9sAIvLUy0}5Rp)lsO#Jd-sfZ2)UQaXXu&vy!=TluodKg6Hw7(Wf_@_1+$ShX%N{bpJppS$d( z>0~vBH?x|t^{7PuuGDJX;QBDk{*&u|%LoA{+}`=9H5TIO6d^}4tLNg4e>P+WliTd4&Pc1Sd*d0LY*qI6s)o1O9nN~5 z_r~{%54~eLs1@WhxV$`CX8NYrIuhO|zpy^S2JI0gUj^t;+GCsXSWzueBX8al12#{U*AY&f~nwT0@hJhaEQ)=(75Z8?!4qMRV(t|TEf!O*~ zInT)D$HrCoCeZJ*OO7Pu`~je1u$jF3 zx8Fz~uOxYM;mA(_6SpkH0}#Uo+C6WLr^_^;k$+E>s@;aW_7U?q#6ZEoOMxIIPcHR! zwcUoySFoP?oKxh}->lK@bh|=nwDA*V zxpIq7#~|bX20#VC+6+a9Gw1?IRP!<(abJ?r`9Dd9ic z-5WXWwls?>8IV-WqcgvH*vd?DdC0cPyWR?Gsn{+Myo*7bp8fK}G(=t~5aBB5aW^vM zJxKuv&MXV-|HIZ*Kt;8+ZAB0SkrGf^Ku{VWY@7XJ%uVK)I)eoE*m9smpIkaRak2> zFA2M|XpLH1#IeK_>{GkW6SK7lL|BrIHbZMd?&!uA3}wp`%VM9PUe`QgT#=6wT$v5R zEhp>Zex4hAp9fOM2Dhwq2p#^JpQJQ&xTL{Bde^3Ao2pUxD;G=6J-a!TF7;g7{87e^ z1_M_TH+>z{&>wU<9Jh`*`7{-0x^po?b1B>gwv}h|%im7Of^9yR$C{O-+P%KY zo8RiqFh_skgVyfZGbL*R*L`A89=*k5Tr6nyEW)W-UeQy4IZ120 z*Fh7}k&~575<`>KYB1-qO8$KD1I=QWJm{uc^HKCgTB|_&ec{An0hh z%S*tIBXpWdxZ6KEcYWp7gkS@<*fLAN7X>~U3f~8zU%q|Fd+_2MbXKKLmu$^!x4Jzo zMn(5x`hCYXYp7%8v}34TJf}>k`xNLtE!8W;Pxr<%s&RMz@r}{1(zF{(5}-e_p4rrK zOzVCuyYW_YPJCvwfc|Us9OYJ)X9X5DK0DQ`_zk$cnkS-|a6Z0)inDikMm$XI?=D39 zNG=^x`)7X#yoYW^{oKA8SS2I*L=8`T=yQnf$Og|h$Sot**qEMpbJWR4$*lsqhWR?r z#^8@Gk8~6tioPjTCw&543O);onKOp}V4(FPbZV!0HFCNpJbJnz6)SA$-i)SSkJ7k1 z{JbvAdCl#+pf;aV-P7}+n2cRD9O+JFlRD$Eu||GhQ6bIZ$lU?@WV3FFzJP24HhsA(9iN`<9wl57VuQaCs56MLSuFgaGc?r*)Bs4tU?fs?SL@hc@u>4Ap3 zBbz*TB&@sod6riR*=Y*0Vf~Q}Z11hgF-I&tLY1xP_v)HMo0;imD8tu0OUQhk75&QG z>e_S@LWqolBH**cb33q^TC>Ve7bgaFOKkjVoAKwT4~x&Mu6+~py}vpd23eJn!p;Ma zi6K4OM*=fWHktc1dVdmNArxKgS)gg7e)(beCBOUZYeCZM6Jo!HqE%v8&1glMBd|+k zSK+BX@<+e7*0w8SIV^t2;#g%WGFF=DWRuBd% zH+ijuX*CRpW3)oYjaol?6u>kL8~m=XPz)&+DW~}py$?E3@_cRsyKkDNztYaYdMHS}tv=SzmNF zORZe#_=M{k;;##41y6t2|RiSS3 zgEgx+`X=|MaFQ$4Z5jMU)*cxDawnV|V@_fn3U17pxp#jhZ`8^ta5>K=`5TsL$JPL) zC!+cbU%+i<{+G40W|MEz(XaKWhF^ad)`aZN)XP?oTD3?FHFDd&FY&uJpN79U4F`x;2})d5sP6>^#~ru&)d|!*5V+X1yYwhnCBf+{`?w;3)!b0;^=bDqc*{4<&#;fR z%O#9E-7&;5DFg2DN+?G^#armdv4C>#H1M^TDS`7W7A~vQXpm!^=t?BdHnOe3qdV-R!2Q=m zS!xR_WwD_8Jm(GXc?P;+7e3K_y-*sw2exZh^=k5FMs@QAG>!xIk?~%Yjr)86`kVQm z0o=QQH=a6nKmDeyaaT06m4t_8gYkeFHVATk=d{2t#eFABOlIYum&Dq5G1!oO4&t~l z5VikWY}{^HGV|gvm^2yLl_pdp)I;3+e7h2bSb(JHLq!9xKcTShJH)LZ58;H=OTE=iFxuGX|oJ~TXt94p8pl~--T6yBltK75NefKz3>;n`NMTwqI+FhXdA zx1gQcOwHU~^<*Fw%co{B4wH(+4LGn5{Pv2`D5OBPW{X_~f%jH-g423LYm$Qa+}pu{ zIfKk+D$U7YN%GM#wLQoxCi}TnO6uZZ(cOzNDQ)u_fHdxfq{K>Shvfwys9AM65Kmje zp&+wl;pxl@a$t^$RzV+EV6W&)&GQ?!0v^*$lZo0tKkOGPs481NcPQz{uq7F^P~4p7 zcEiZt`g(#ETrWS1=^f3fne`TQoiVOSH|qsY)RUUj)<_%Acp`Yw&aTT9b46zg zQ7>mo(5=#Xn>TO$l)8fmA?dy;B5p2B^U-Eqkz*yyDB;c@rc4;rx%xibn$saIU#Igr z*}~9`Jd-Y+7tkeqAe?#4Ei{fFFmH(d49^&%vyI_BQ|)Xeh%jn6gh@v zm^)Zu;{;HCciWvEeN1?)M3G{{!)Y_A+K+>(+0ydTpd~#*h#@P{@uOg%EMrv#CV^^f za8V|8U3AMN`Nq%{upBCp#S!t#Hcz2mPpG%atPO=aYH-rb``|{b<|{t@s?j~+^`9J> z2j1nM@6lBCJudFU${(Yewz5aly5{tBaVj-zrHK$ zJ9d0mE|#pfW+}ZmiOe3;O4E1c-YK?>jT68yp1W+UdPt7Q&`tBbpW#l(rs6?S?VX1C zF(-Ox6@SuojB}tN5qP~Tt%eTpMfc!Oo|o)l(cxM5K5K`C7qwpnLF(mXT$KrhF4d~B ziXxs_1uie=N_0yx6H8Vpteyulrm@CyDo1KXRp1f}ba zt=r3-@W~#*Q~j0eg%I8t*8<9IzhxHdZ9m4sf%b^@z9p>lEZd{%F>r~(ZUmkJ&Wec_MIYusvb$VbDzI0x zDQ%!gU8?G!ixCDYJSxu_pkk51Y`ZwI3vYw;^hB>ge+$BkN3sBub1az=4dAFFd9$n+$J2D;nr)MpL@ty&ef=slXD{t zU`&+0V>cHmw2tvbL0-rtEcHgVXuG`l>V18LUUC*Z&Sgz=%4&k*+gP_G>@AdlW5Pr` zU1R2_Q)som68-LVL~D@F5pR!nZG^|UMXkF3X0&8G4xwn`+VnMMpBtMu!*ySkzrXDL zs$DV7^CjK5eb|&M<@KONUtS=8^@|&!M7No%J_X(8ClT)Bdp{T7s_8Ns#_zi(KEBDM z6nu&GlD=y-qR;uc-?_v-Zx_4+c3ej_QRixlfu8d; zJqWA$gWyjvSs7b%T}_}gtx?l6@Kw(G@ z?hF+u(!M@jim-7dT)AYiErX=SyxR%AQAhUcZT=OT^V+M;^BKE^a0$HyF`*HOY_(V^ z9rGbd)mX~sjz6Y>`G2+i&Q;D(NbvCN-2kET42fE-0UtOg{v z%Yq}$sJh$lU9x=U3$E;4SsE>ObPduX6wx(o@E*}_!+vSa*Pva7b_XsWzVTGbm4Cu@ zGq{rm*8Z^CSbjCxOli_?#wwN5a%Lj=plzgkYw`UReAn&hopRb6iwWaV(g#PDP_CF- z*PmsEc6W4Xo3MKp*NxvSe2uF3xWw8Z)}@w9;#R+Qy2ST3Vm{22`4%=Ze+yr|XjxV= z^_H6Y@yBxVLV>t1*Iaz?OhP+4-Md#0`@lj!`2+1s11C|r@w<}NR+AcCUG$IU;$K&z zLKy%prseZ`*2gtC6`M}soV?VgTQH%%evR@>xAU+g&G{O${W6eG)17fMOZ)N6iPrMD zv(TS)7J9c+BDAcchf2)yjxYJylPPEt)%ewfz?A?H2_|Vsksz9|u4|U#OVO`yi!Maz znDAs1#5g*zkP<-|n+8gcUs)DH6Ct2{8;8Og2cE|k(OV5+y$I#osJ53yp~VgJpQV3w zHl!%rQ;a{&0s25&!gJV!&3efma+<%=odB!=lR7^Mu{2nz$^ICCf!{25j-6f{8oxL-?#9S z+5H+Aw|>M#tD7b+V+^a7Z+Hf|&zb0ss8`OlMp$F*nD`YtinxzG8{aruz~oSxa@vIX z&Jx&Ps@H~cNY?kh_4ICrok*{j5SG-V-UUaw`}a{k(nN!*CQGs8WxqAbg&j7O`nJA^ z<37Z$#B!bUsXi>%D)X*%So-nZx%%bcPM{MMUL3_kAU(8~m|#Nm)S%YALJ~HqZsu>z zzS;DNheNgbeKzcs--89dq+NouX&h~Hp$SCJuIqABsrizktjS3@^MNo27S4B%_F30j z*O0g{uEn3$Or+}H}|$^0VcGzoW8K zlO%c$vI)FE_rnVP!sNNS`kDpK_>J4{^4GIRb>9`Fw*`qJWtw>wUlQjOY4rq5IHLyS zkjT>ojy~eETYu7}WtL=8+SDkpv4_sIhsh4?gZjY?Sz=ZXz@(&{r_S7D)StxPp088? ziVV>ZM4j`G1Ew$MoY+E(&HN>ji%pVM+^MANdpP0j%ID~Gy6yMc2;PpQiiAL97Z zZ`|i9R5I1K`<|ofZmEr-ThGnPid5ofN1tHkUdEyux368&mp--XNi`nvB#b0UupiHu zh1u;L*%G=ojs^KWQ;*=G3v)qD&+7pV;r-jn(1q3 zlB6%OK8|T}$m~Wt`kvh;fybt&u7uVKB0850R+oy;nyL;D&`)MFP9FPFkQw7`B0V_r z(%b0zn$)lHh89?7?M|FF4Smr8l|Hbp zUFs{6ku~$Rn!bY_+MRil@$M-!tEJWNMUFo5cwcP8MvKEi5WiaD>k%?I!wvFyk3!z# zt?0$z5$iceF=-Z2>1-oIF=m4C(y@gAjVo|8tfK#1vvSsL&S%yk({(uQTeElOhtj09 z7xO!{yF{9$G}F#Q^1v+#?9YNU3ydcFPd)W}W##>$F^RAB!qC8dA;=N94^#O?$$lUf zdf6%-bO?^<9epZGk=f&I<58$ticf`Eb>VtQg|>leDB_(96n5h1&5fe*GOR{QLUVuirzt)xVSEj@mG_Cp&}* z>YAA<%JGyw!PPZb@_jUC%65H-h8ylOonDdU;+XIdg^PrnXA@o5mh>-BaL7!AXA;6| zTVGfujPwU~x8I)G9f4lw>Yobt2c&&$m*2Nu)a@H|lxQu9ML7p`u)z+imut2hNeAP^ zaz1R;P;qa_98%+3*rR3r8^(J%V@R|?0ixJkeC;;Fj@rfAWt-Gv$4 z`FMMaP_E?G03##gK5;nzPE`vWOVDPL({7=IR_$2`i15$`fQ&*1V_}_<6QFg3mYU+I z=mvQ#*YCHHnk@bb(P!7JXlW+D$$B_nal5HLt7@Nn;DVIxwZFjWYbfSJAoYv2uriFxI9kx}E9EE6>AaKH zVqz&#;VLU`%cn^SVbx+U4_hkM2ij%3A?zn~TAS)x1`7~={Ot_PTaf-di;=LRF_@d7 z;!=@X0MWVp)XC@Q_BJ981=?dO0}v^$Yo&L9;>uBVz&@=w`$5l%B~+UzJlY>O`|ELC^K>W1&6A8S=m2G>B37o? zHqZ%mn9y)H8`{|Nr4^SG4!vHR+U#8^4+=zF&bRF@#L%1L*oe!{I}s{Rv-%#Za$mI& zL#fB}N=EWr&;%(323L4%>NrifeU=E_gNppRp;u3|W<}U)i=+ z?Z?7(`4W6Lq@mH=2bcvOzdeP4D>R!HU9%@yWA+RwG+_2=phqFzqM{SjVST|=FFqlS z1f1ViU=UlgKrWzCNc_rbFgtp-{6(?L@A}-JcK6Iz@>kRS6$3z`WibXx`a~%_dsdaq zW0y?0@#y^w=;t{IAg)tp7w^iiiVQ&`th&3?03#qB=f8Q3sSX2Zw7j3%dbdy=G;3O( zQLtWcRy7O!vc%}z@SFA7KLOP*-9UI`w*ESLwA;W5!g=X>kw{E1ci~ya31)nfQo5u} zx#fuUFrXA#KIk@95BXp|kQSuJMB*cr!gZh4kb;%&BQdLOZMYVO=XHxLPSFeh(3D4F z@5e8nT(5P}Ny_^rR);oHXKX$kds$u+W}OLh$^u|2BP&*sc}ea4#p2DOU4tLTkk|m9k+NfRAP?ejs(y>x)voTiyiQ$m={JZnQcliaT6q9Nl$X za-GRgJ5jL_YCOuZdX8;q2FY=P?Ur)P3s=JZ^Xgj9btz%lOfS9k&8ojJqR!t=hv5BG zhsH5&M)z{PSkl(9Q*)X#pK(f6%~$WHIBzG90y<0QJ7NqZIW0z(IK9?pQ#b_&xQAf) zN9oyZoArEA9r0@(%Ljve^S(P?Z~?7K=j4P$dw@MZ(|uurOWEjioswK$!SW`oEXSbE z!qk%KCj>j`%)n3&!W=K8?aO_&&ZSx~_6tf;-F%ja!)TOl{a`_*Z=dlhUrqAXcA3^CQK?*f@w zEt?9&;Q=6%lBsrt)qPxOCl{4)+yanS?Xwd=;10@I^p~heVwkj)aZ0tit==SX+iVH0 z0+492lKn`4*Ow{vv_5{O3#3Z4_86f1WnIwMDD5nYzcOMIQ}VJ*-bL_6B?Ts&og^d> zmkBy@nV3-5x=BTMaXjU#7%63O8j*5zgw8T*eQrsZ7gd9sPhp&gA`P7M1`qyN%2`_g zwj|6O<7UNzz`grvSkLlO(8%oiCZ!E2s9vCIxW91y6xQ&e$w6T!G_swNjpB>2pBi_e zemryMk;5m{<#%2fE;@l#;+qe$YiXDFgT=QI@O@sso7dxLBY_UFhwI&+O}s&C$KlPp zM^#38X)*7vj_*lUgSrD4FX1f}LN+~9NJb?o5MW||p;5OT7?7Gy{Rftgm2TvbTV<(j zQE3Y&j_DbhrM^*ZA9a0gf>`C|$K=5PQAE?4#vdOk$w zdr)GnUka7Xg8QJb?AOE}nNFMGw*AK5Hl&;yOy^>eY!5ZmH^%OwX8<^u_*h=2OsrG@ z+bZ$DHo>>9)td-BlCe$pUz5w(_6-F_cn-zc}W3)ysf&lS(^zeyJRl5HOqwXYXkf7J`_!Sx= z?OsUIw_qydh_A~dr*XLOw3{Yd89OcKGnUX_A@+-EtPl&4e z_x*Mr4K^ZH65ck@Viv{vfh1ObP@QleXr64XRcGGMW-&+`@L-#Gi%YN7o{0}D<@_o# zdcdH_kd|8ef%J_BNaEJ zKGpL<4BySFIP;NozlxYAw#+)*`Oyz)W{>mLW;kbXNQ8epuI=qo&1djoscun^`lz@K zfDTT}$2V^35zuzQ*F>0Ck_}B4Ic?^|UVdd+4JnmY1W0p1>*qc!1qg@muS_cXxnowJ z7WJhMjTV5{oFQ|*qgAUeZi$ohpl&rSZahCAXC|t`cJf`<9aE|Tf!Fnr_m=|ZSE>+2 zU}ljZ%`7yenI%9bSQQ!&drNrRX@$)F!>Zwzry4WmRvI}vm5?K!M#~X~0G$Lv#>Ij# zWk@U<0Aai!@Rxls%}8~?3>;=EYjiZim6>u%Hd%CAo8}trfR0(5)`m9F_AOM5wF9dX)!t5}PTXRm z*hDP3l6cszEkohPTes(>ED}g~E4-u%QCAQK?@UrD0MYWq4HLdQ;*aL3;ii!-8qGbij_K<>k9%=unKhnWIo9LOhv;v4n{mEKbwzL(*_x>0*z>6OjbGIf*gnD!Gpg7!ZK;?pUCf@SpFGq7yM}kj4>KO#Tat3%2#Y zeo(+7;rwcr{%dp{f@l>Yri#>tBBW&F~P$qxgIGvEYLV4`tIL{D+J0<0GHhDRRL1=WP$@ zfuoOb(j8~~hnM4x1!JI;JF`ys14!-%D`~J697`|#4>SA}xy;X=5&gY9d*I$+v)06a zc(+%oNcb@WO%EJ^Fv0b_Pms^Kzh(XP9~R?)3pqkh_wnbyM;P!H39u5S6g>v}>_2wS zpU;j+l*+VO7s+4PL@%_8VS#0Aij`@d+BW1uJIb;%S{%oKBIq zpNoUSz{SnnX#$l0FfG!^89aPg^0$DHMo!BMPPzYo{J_EmP$TjDQRJSr zRFewPf7l*qq2PPpa_Mg||GD-iSeXWY><6`f@9)26;P*T{1e;yxR^-H=w-Fftl5(qAi1MT{H-+K2qN|8OnlL*%qsi+J$;HEqa2U2susVgJ*# zp(CfQUV&RD`_dk^gpdl9)gE%Kk!=7ALDv&AMow2@}0fSi|( zSl|77!F2#SMI?x;!L)SpV}WcI1g|x;)IRv1cmDPH)dS={|CAp8-N_QtiRIr zyFBu6#8;XEB^^8pC@FKG07u~?A){#?|Mdmj1OOoJb)NF+z7& zr3|lL>yx8bZi7ga7)VgR{i$F*Q=`@^0GI3R>cW(Zz<-FW*GW5M&xQi(gbaZD*B=DH zBN{+pydUn8rI;e*xLHv75@aH{x@?j0i6#SER7`laXq3wz75rcSiYx$y*Ol*YP9%sEnH#CtcpHcSR0m>{6*dXXDHN|_HSm$i*#CO;?_ZbEz@GLHEyoy+ zn+w`>4yI~Mp$tMeOI5v&Zf7FYO~639uRj@dTR_o;ICClb-3L^8>IH*8I;OI>C76k; z(-oSKWf-9HVHxpv+Rh}=NFz-2f&BJcKxnvL7UrAZ9i_?X-&WxN(UyzxZ&f?;sTXuK98a+&z*ho*Oxi!%9*U zmkesT(jd*SEp*1`b!^RSSs5}}pk5HKS5^iNN;C{`!4=qTY3O@M6s0^t2C+gkuBE$&Dh7xh|jVt#kMxD`~hnI+n);h|1X=Xk^b&I@xq!7hU%S~&HN*i zSEKC4ZR2RSX3GBHEzhlax~76tT@kPtGlK3%xgd-&*qzRgthrm{4fMgrjZzRoyb=7m zK9n`pAR5?=6^Q@%rMty=fQVl=b0tQ;#Z0P=(ZDMviVYlwd{NY36PD)M-3BWI&Qthp z@;Sfj%Y#;8gEz8#>p#9MF9cJDZ_+&bo&t77$|n*o2Azk3v3xGMCi|e?W(tjLfuV(R zesJk@Lf`MwC4epEiS=ZeOcAbWzwGD63mB{8q(#Ua{@jl~)-KrjohLBqR`rJ-=o~h8QLIj;ir#9vdlPl9 zx%nHTdj4M5dN?K=V)YR)A82(OY7QDlN!h=ov$xUL1d=t?BoJ|^q zO!-=lL2MEN(R={+ZYh`Fv_pF*N1uT45}N|=2{_(&AjO&T3EDiQ4~!3cutNep?1dKs z39Qw1X+&Asrah|+>@i-CV(4!?5&*ml$jI5mW#iRRq2po*{bV2F>hgR$loeXFHjo}H z?{=L*?T*~>)!ASP)_t&9Pp?3E)|5ofQ)q2q6>#qUw&DK$A<_Vt0g7z+_7W(0s;5ue zs6zp=JwRzWXdY6m6@;1tlC$Rqm~yv8Feu z`WmaD6pgn+gQ#!WI{=}!OZ7Z~4JYQQhOR?USi5kQ>qC$s5xfF1Z9ry9u|HVWqsp{W z-)u^+M!EGHndkNs2EZ#snx~d)6Qx-K=Ub)6d+n5dWzmrMOdY}%hr64g-L!pa`gafb z%CQOhwBoX)^wGt<5r+DHQOyZD(`XJ#HNR^|RvN=GyU+uAo}aDQkYGTDIT=<_$~j+w zag&3BExb?gB$3Q(tC;&9E4uTR4eB+aI|}ZSO9eFL>X6>+60n_U&w9hQ%CHm_j1~ShtgB&U*h&-YDM8c0lDmsNigeGh0WCDk}A=bGxG{MHVJK! z@~9SGh`z0Rm}8a*zW-i07a=YSun^*e{TlQrQA#D8T~S8~euk2v=5sCJ{521~+g1#h z;?Jv=5Uax17J2@KKG4^qscd%adm!umzlv8x2uViLl!|0iLSftzf8p?o{q&}W!Tg?+ zfYGlHRo1wZ3z@$NyVPi}fv`fmYQj?u41SG0w~4VwfJ4kzC>}Yk-y`_~fC`M7W{^0g>qn>6#sHN6VOX^a%gj z@Fv7+ik%*j;pjb~slBWQKs$l}IO}aDio<6h>L;*c<*BzbS>Ekb8_3Bc{#()5Yz1%A zA8dRg%U|ek^z##+5HZx3K>|Gf;o!~vK6uoc!-N1@g7;SMCW-nYB*Mi;l381?ahKt9 zZ8SoZx~`_vq16+-zLrewj=b)7g(+wtTOlj@S5XBWsQM`Y0+pJm7z(L0JLNVD==T03 zR}3TJDmj|+n@^FsX=V1wY=5z})TEUUb?-~q#7$A~o-@u>h=BeGiMJ0iiEl#Nn)1m| z>wdOi@mEbc8mt+PVnd#uT;YFvf#g&Pom4!55$S8b4!eyFh@XCEJ^%Mj5J)cxl_ssZ z%J2Iq>V(Z9fTHg*@2s=*Z$vv>Li1ihs1Z|kjm(O|mt{SWZJNf9rJ&I4xzh@UZv5%3 zjiDe@J<4w6#`f@e7|zlevlb9#uxY{%R2byHZKmod?mm*@NnnB6zc3RVT-*7ipS!?8T z6t`)I;Q1iRW}vgsuq2IdE(1hnZ`(qOc6hDtX#KDIzcrZd#~FCZX15IV#o1PAU!D8b z&-$1Krk40ev08!UPv;q!p7ghS;}W+074-P;9lwkgP=~*AEqvp~jqB^aipvjw)6;Dw zp(heZkOmuMNPn3{6$kWRY5vq73GWkP5iyP9dF|G_;T@H}mckVkwbm37VY)BM_mS!e z75TavD$`s80ll1~jBRNr%+amyl!Kq2|0u5W{dpghpMNA@3vS>r4bF99?V(pFAtPOD zC^3#%9UxIG68>Pe*8g2OT@rhu!KaqYxnH!Q1lcbE2F@9e18eQpvp7x*<#1;ZUjG70 z)j|%;0Y8d|5D@lHwMu>*?#>w`0|Gq)U{CT+079x|Ft0J~6kgE4u!kIyU04r{gRe#;Snu& zUM2)8zsjGEZIf0~N1NFmfp$&rU|=UaGZt$PtZBSDlhv-Y-8Q8Maucb#I?IvztAx!j}m&vohUd0QmzBuSc=GGV3&H*K|XE~V@lzm~3DmfK~ zCQtk$Jl^zRxw8ZiV;~eLcKLH3Ci-0=96>XY_&R-`Bej9+p@l;|+a%wV>#K7+uLOFH z%djTV8z{K`H&Cf=+{6(1>to~$syamXVfI^fj!!Y}S#MdOCmSQO+GXa3lViXDiQ}=; zud8_9()WCotQr=r1NG@k7LXL>v|$I}!64B~^gf<218AQDvc(;s z^)oXg^t4@3x_OsgOrK7uR&5IShaVqJbRb$i-lHOaB4s*A_qb%RnxNb8H zWhvqay9OckkBBKW_R%*6HTWu(9k(1ke&hfSt7rOmS?U7mZS9J|(^6 zW_;?-P;q{88b!e)RbF>wn>CpR`+2|LQ@k3TA}81g2u420Xz`>dXS@uO@JhO?ChGmu z|E9y71_qo(@Z$f^CYade$2S8Jyw0qE!~|)KLxRJYLYarzS0 z@wsl9UmT~aWGOgaU!ElBXr#&qvlYfkVingc8U$&(3>+2nqd1!dKn7it6d1;f+?(s# zD)WA-Jt)nSoAJ(X1Pwe60Ec$M6au~)>_#}g>I;b@S}9lXoyz+1z*R${%pZdA2IQg2 zm9~0EAE$QdsG5QmT+3{xMt@bEE{2+b0>p*!Vj$YaL1!KhV6(~9Y5I`%-cSsnWpiAX z=D3;uZS33nnQcjLlH9Oc%uZ2=>kj|R6q|{X#{z9>OB+7@2X8Y=U8F0Lx%Cd!+z!TP z==h%Vy6sG_J;6J{faCF21^o9;LvA`MoI6xddVhW-wKBjTh2YhrsA&WpuMLPf!)iaC zj^?aCv{G0G)%)CZQil^D>hYxJHxC$HE+c-1Y^+9x>l_ zXSG^BuCVXdIx*6*l}Dh$&~F(Sqg*R0)-`KZDMCI!fN4gjso|CvS-6$2^1fzCMB}Rc zS?3qZ=DNA#^}r99s~gUX3!^%A*e3y2ZBi*xSnwLz7aB(mAai#B6s^_$B_OWpXKLMe zOg~;-o)`>tVvn^FtZ;=xddEhFHcb1Hne}R%*}>rz3Lv$u5_Jv^1fiSJPEdz#`O8%A zxt&Hw`;=h1#b?60chSV0Nux@7B}aENx)AFPtJ7`}QWbi+f`^O_DP=81QW#xdpv3G;8+K*$1=0jSmgRW737Q2QMV-i!*yema_i|D{z&jAf<~5$Kul7Mr zwA&>Fx~B^&WgS5WKgkb2C+YND3WI}loiv7O5!#KAVKoQ+?UAWY3?Cw9=+tSKtVTvn zbE!{-Q7h*9SYZlc?)^j_;YxXuXOV4Y;@mN?e0@zbJe^bQ#*0K*>h@j?_zvGmT07fp zs^P;^0!f$QUyLe)30kF$-JF@=RI70XNW)(lcY?@4znBX~7 zJ*`3=9`!!tm!Wq#{1hr~##SQSSVi$*v;Prh0ckQf4242`$68*i`Oj22q(8S-=?SEDWZ1}i0xAT!XgYH5 z#5nUaLKPEv*{$EMKsow2E7C9H^?89qD4|i7w@#s_mvSd7Ee%tTVI^~v zVi?-`{mveA%$OUjz0Rc|`5c zX7H1Lh~ncJuwoM4>0-G%DMNe#CngGv9iXfcV4I+1JjMe`J3t(~9l^lD!~as?$ZtwD z#|Jek@s|pD$YF|5iGd3_P~(mMS7@Mp07B#D22(EP@5w`p0KYbEa#-H|pSc7+A_m+; zKKA1GR{|y*@Pxq`#iifB{+AuW4rF@!uNPE*hD9X^9zN6(rTf1R4+;TK!>>mG-=JH8 zf14H*b$;&rLQfy%C^bxM;61QB03tXKd2FY{(NB?ggG?8Wz@EQqp1M3x;{1Te&hL?h z+MX#D6x}RFr_1r1Rfn%sQZmh?fuGHnUG&B%8i6=}P(J-KXrtT&e#Ujs{fqUB49OGQ z%x)~zP9~YJF_+0XbllIk-aJ*W3xr-9ezMlR^ve90k$8=~Ff_M@FsSSP`x9BEwJd8p|h$+?Ub zYA)8p+fBVjLcIY<@8o-j+r1l9ucX23oNtZCb6ItP0Il2>DCqCHzB&<3dFmz(2%#&y zLB$|l>R$%YmU}E(0|>f&Oycd|Nc1_LC;>(kQ}#nOu;noE1NN8NWjjAVHUVrrj!kI9 z_dn!Pf{H*#K!GC*>-r||lLFXj5R0L#gUTmqv`|WiUU}u_^IOjE=s6Wm4|`%S!W-5U z2pWu?ksUX0KZjD zoya%nlDG}O0dq$8H=YcpGml&-1?4$^EX0>pqq^p))lfX4$8<@@7S5V`z;OPUW`*4p zLyNv2)q&y7x;)*yaijv zNLv0}ourKKnbbE8rdS#Rq0JAWxX72~O;3V^s>z$>sH$9&b9%`zR2LhgB0Bg%vp zUZ}u;;FaR`_~Pf6Z(y@S+#CM{aG*aocan~Igfek;9{K1lQr5nSM4sLv1Fvl^0v!!# z#6u3ckgwmfC+du@fE^lx#d`OWrkVS$;q2#mAY5q0Qd2SDK4*tfD?JJA)+Ei|a!hw_ zxlPr^mGK>u5tz-E4LozQHjjx*knZ8&*fDc~#q zlF=n^ctZBxjb_my}#j8T%zEm*-GNF{K`(lzXq(92Z0LZkNQt?rfUkB7eL;Yyy@lCs28*LS5;**1m0@($Zxn%7Px+<5&-$*m&mfE- z!1~&!gP!R=7EmaUfL;&?Bu#Ruz(i)}64;B=^OBGT3pmakYErQgJEA*4;0mK+eq<8{ zB~(aY&;&f>ld=d&7yLe5&y8v&P%`MW3!mF!&Cs14)Pw$yW zI#F3`JyA7!I<&8pwSTk3k6+OmK0S_O5LMnygxXtSxM}=jAz)kX%z2DMJ>%K$2{wym z+_TlKed$`DI#T(XqHNAB_TJeHhuYUVk7la6Nj>}8uM_1)-`NeFE(jx}i;Y_Ee!P>? zNLY+Nte3-QHO&^s4@;oxSj_B)qXAEIqYbYSN2xlGv@$pFgde3UD ztQm0kuI%O6kqLl@mUtr^EkK&|=`BN{?d(om6g*TA+NVB)m;>V(l)OrTfd1oB)1J=& zm@{)qL+!;=Qz}8Zz0B+r2wi3-# zy_zyauVUOYiCJ%s3g$ig7k%jj?q*3Y(VVu^^K8U>XsgVR?WRK(p%Rc z%Z209XC6Q8N^Y_!n0<5#HY%*Ro#G3??RO&sf6z&DW84**n&GjqN%X?y0t|KHK2GUi z+Y=-kg@ne~Js(&y86uiVPr;egJ*+0|$0xVf@t7xhfDZ{V(nHt8z69=##_=YW zo^S!RV{`no6C)-kMZ(;%sFvQM+FR5;>f58K)jSAgv8%m?xlqAT%UP)&-ERlI#N$Pl z)fXEfrwOCt6dw{SuP2IkDn`Sdc$lJvCw!&HPCDXMPE7{Ko}HgB6z3B0GN~nN+n4B~ zXp923cp+Hc@O{0`t6gC~uiaeik}i&uFKaw6dh$mshLv-NA*?10s_eUM->_Cs`2vS_ z&s%fS++0QX4qOYA#d61Hq!_j z9sQY+92w!ulTa7Zu`8BtUqsXF`$Ex1sW|t(U`9kr`|hdp(Br8Fszw}7mS4TIwEJBW zPKzvE{bKGeJTZJT6R@4Hmh=2-Dp6vBqHJ0DZP9=EjpRK|9(6FMLBS= zp4rd;w4Y?wsgMS&uq`L+$Id&`S|C)yQfhPvT!^nacJ+iH`ySbegTjtM1|p-#IN8e( z{Kt+0YTqxDy>^f&195>Nw+}nkN)9>_J8Na}JMT$tBOR97Bz_E$UM6pz2u2Ux2>@rPKQ=qDPnsT_OA+ck3pn%|5=4fMNJAF?LCqA6#QRMnbYQg>H zy2p51o?96wUg(X{2Xr4RI*S1Ddt3-%ytCS2<*ooZUOOQR4TU?8FEm~=0qVPGd39bP zD7vxhXYQ<2(p8Em@blhy6kWU#M-$NJp9*{2(t41@ec+>Lot#)?>cwe8(-Xe-W>Jou zz5hZf8y%k8zu*48ykvqPU~A_#Pda78Lu+v_9wx%ZTJ5WLJ9JWq*?94TQk^Ed#?7W* zwd%PmdAUHS(d6%oe{-%eX7%|=_9=1gd?7kUuCaDqHI{Gf7laOw2U5E83r{Afo!OEd z0miOroz^QC=c3(nW7eU$!q0TR`M!fP*)+A&=E>JP%CWb&-ZK&9EO#ImmZcv z={pVI8wqTDcSe%>Wy`Opy)REym|3-0M!$X;wfT5*UN+3}1;*zVoIG`sGdjfFQh0sJ zNO9bzv9Fun&c{l(dbm6iDj(5+;@gxDA=uwkUHaj#k6;yzSYlD#j~dv)esF zy8=bFonU)gT#eZia&DofhGjLM0R+2=E!P~fC3UHqd^~5=0Zc3}Y!tu)ko;uw_zfFP z*$kRGSx3VoXSF*udD;H@-(R31Krs0?(nqP8amB_T^LnxkkmJ*McWi)o{0{(-;C}fF zoG}!sL7tIZ1OerjUfvi~b@9P(!e>&7WkZDiHj1^)s6gbaW%?lWd0$>$;=ltB!dLV) zauUAD&1x3tTJ;s-mU>??#c}?yF(U5o6$7}zccXuzV|K9 z`=9tZJ8{*y`uOB%_J2%mmKsyFH2nENn{ebVGj!QxZ+YY}LMK<$NY!uHipye^B7ax| zKdx~|V74D6!1*H8ML%5SS1de^bl)jy=F;I7BCa2UMu~C_aZ`oKK}w!c7`y2iU7MO+ ztF7E1ymn=xX&bHq8So5Pd31SMVNaSjSA*fm5t*HjnDWG1m=uL^udeufgY$*(GC|G! z`lxWATdv*N@7Ey6f;@*a6Bp~NU;m_xSye;5p%jz@;7wk1gHC1Jo9i*MKX5@8XCoXP ze@JqY7>l9h9gs`Tt83#GCjH2P-6*F_NZM6*K1%9k++jj{nc;)?Zox}aQWXy0+C&?9 zKBAr|u!${X7;l^PtHx4O3vj5p(`?2UI?cOSnniK?xJNNVpS|8nL2Gr|vQ*;UvAbuY zew!yWB+bekI7fLoZ}X>K@QjUpE{TXKU!~QV@EXW@W}v6j@lVBr!o=WEhsdr59$cEU>djltn*N z(ch_TL#rIIQoA-TPVg(y$-GEe7q*U>>2pT>3R&9iEfgCeo7(y5x1w=0NKfY^x}Z9? zYuayl2Zz!=5-k^0CY(}CCr_dunnB1^lW2ZyDE zWBjA<;kdjqEP>1vJ$5dSXqPX5mwfeQy3?P!fzD!0pfhl-emZW}5r$n4wF`7P(y^x3 z@xX5t$1BTL^^iVbZUY1f_etS$ z-MgF#NYAS-0v(aqr`9`rw_69&2VN2^-Mlug{7S3(wQN+eGPE#G}pHb zn+;K7!*2*K7Im-V=ZoXM^q?ks$JyyUX5x+J;aQLDqAxsHigZon26hw4b>Dk*yg z3jv3fm)yt7QdU9Ek}M=`B6!^A z(LS#2eD|;DfbLJ�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ɦ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�o_(z@=($qnn-T!Pp`3$fXvis*;*rh#fH4;n46t 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

dq1+b>xp`TE zSIe_pby_hm#U0dTu)}-TDxCI%7=69~D6Y71l1Wxu?u{kMW<6?*7u%vFCm-DVF2P8# zXDK4B9Di;_lh2Y7wQ$6|$-W?u5E`$LZEe_gSR-|%*x@lV^JY>zqc|?(d+$Dr*F31^ z5&F{9egoi%P1Y!(x-b>krEjR-?8LwjXwj&K)JnEXNJby;@YhFtn(7{7Z7JJd@&50{ zUx-yPB+o><6jxEet5OQl6(^bZuf67bov^wrO0|DiV525wZsF$Tpzjgl z(-P`iLF6ZUF3A+pAv-)I)o_&}d!Q5CmhoPTs9^PQ)K zeyF&sq=ozLqk&pADjEPScXtA9%DeyO;Su@PjisE(;rK$4PMxlsqta-n`rO7@Qgy4C zg1C*iCH<)nkLBWv@QH|Yt)IFSJ8{w_B%!n$mqtzx_F@w-37)#0!w2tqHou(Zr`VC- zWzMbTf$6%TcKW2ljM|siSzceeRQG8MStLp{UtYqphsx4rCG;(e9oj);&@%qBkKArL za>?vUS*Z}OC7XQXW~iz}<#gmg5VJ?2CG7$I$LqAC57;wHa9zA56&r1L(cXP$sQ;LQ zez7H;{UPVQ6doM1f7E*OOJ`-6eJkQldw%#BGwgLw(6UcU4T*5tk_3(Z$~Y*c(Kug5 zZF(YPQVD{~6=@Hw^+i^E_wu7)a~x2Fh*nQ~6!I5e@IBgJsv;|N4yq};7GuV*ttK;1 z=zI74dz9BRvC+u=Ud5i+CAztwu@HAL>nG@`FUzdW#0t+CyH^pbW%I`+&h3I&y_j+& zoxvoHt8ZWTO6lU0j|Rqbcc_Eq>J)xfyC3Uwgr6y;Cd(pgs)Zi?cpGCFIKWBCiKjHr zCX@X^7k2wv6Ts0gE)Trj+8q?)y`&#%!opr!w{Xn|L{V}i$XP&$#nlPC7Dz>tJw2O< znw4ai$H1Q5+)gb|@ld~w`r@o^7rpCgLtVT(nxiP~2^tzwyg<{gIiM9 z5*jzzXIZo`A4`q9evSqBU7`3yrE#MJCFfRq3S`CCZZL4KF9mBPyNDr1K!Y=++^h2TmoY;+~H- z&M_U#uMvW`3@=OY8TU3HpQW)h@z_-i%zb8zIrqeT?9_%7 zD6#{adT_z2;YXr>O+Qj5ltM~OX0NY9Qy3l$CjyZT};<2H@?lqCtrT|mp2wjN1i4WHG`~|o6xnk z#}^qRYER-$dMQ{XR}7#ymM^uQU$4oY!*oek9~JXzps|MD%XclI=`(?{-_^d&sVhg~ z*k|H(Hk$~qAe%1Z=Vs6~+V)K{9oh@)Z#O+N&6;;WV`;pcKsbwMR$FXy^6L+BKGb+y zbKA+LE)w?7kil`*`$5guEK>#|_1+^AJg4d|znY48O+I-lh3$}uAI`VKd<-T(HN@HR zM*NW73uF2wznwU##qoTOD|~*eF`;{{Z2b~Rl+2!ffQD;af|}ZOCG!M|_p)n_V7q;7 z17dUaIcELomb3MrJ>!oV_L>Iiy&lMF?}_guT(XsxbdA=OwKAu zavbyV%y+sn;6BGcmcaiwqq;ruOgvwHo$1LRw`Q(PVc%q~%sU-r z``4TOwR%R7AE(+mX+I`1o11KBXzUJ>8zLu;**grJ{>Lf9o6knPz@OxF#vXk8%QW3Q8Tii^)m(H2fk?k%XZiHs9>?FVqdxLQ z$i4~exR1}@AN1d!1mX&Kj^!=uJ%9h=Z)a38M^gw2HDRtd_y0@J` Date: Wed, 15 Jan 2025 15:16:37 -0500 Subject: [PATCH 34/41] Bump the resolution up to 1920x1080. --- src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index 7926924ce..a81572e00 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -92,8 +92,8 @@ EXPOSE 5900 EXPOSE 6080 ARG DISPLAY_NUM=1 -ARG HEIGHT=768 -ARG WIDTH=1024 +ARG HEIGHT=1080 +ARG WIDTH=1920 ENV DISPLAY_NUM=$DISPLAY_NUM ENV HEIGHT=$HEIGHT ENV WIDTH=$WIDTH From 5f92889e0ec8bdea7b2057c74bdec4d1094db04e Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Thu, 16 Jan 2025 10:30:15 -0500 Subject: [PATCH 35/41] Iterate on how VS Code is installed hoping to better support both amd64 and arm64. --- .../_tools/_computer/_resources/Dockerfile | 122 ++++++++++-------- 1 file changed, 65 insertions(+), 57 deletions(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index a81572e00..7907077a7 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -3,60 +3,76 @@ FROM docker.io/ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_PRIORITY=high +# Core/system layer RUN apt-get update && \ apt-get -y upgrade && \ apt-get -y install \ - # UI Requirements - # A virtual framebuffer for running GUI applications without a physical display. - xvfb \ - # A terminal emulator for X. - xterm \ - # A command-line tool for automating X11 applications (e.g., simulating keyboard/mouse inputs). - xdotool \ - # A command-line tool for taking screenshots. - scrot \ - # A suite for image manipulation. - imagemagick \ - sudo \ - # A lightweight window manager. - mutter \ - # A VNC server for sharing X11 desktops. - x11vnc \ - # A web based VNC client - novnc \ - # A WebSocket to TCP proxy/bridge for noVNC - websockify \ - # Python reqs - python3 \ - python3-pip \ - # Network tools - # Provides networking tools like ifconfig, netstat, etc. - net-tools \ - # A versatile networking tool for debugging, port scanning, and more. - netcat \ - # A utility for non-interactive download of files from the web. - wget \ - # Allows the use of HTTPS in APT repositories. - apt-transport-https \ - # Adds tools like add-apt-repository for managing PPAs. - software-properties-common && \ - # Add PPA repository for Firefox - sudo add-apt-repository ppa:mozillateam/ppa && \ - # Userland apps - sudo apt-get install -y --no-install-recommends \ - firefox-esr \ - # A lightweight PDF viewer. - xpdf \ - # A simple image viewer. - xpaint \ - # A lightweight taskbar for graphical desktops. - tint2 \ - # A calculator application. - galculator \ - # A lightweight file manager. - pcmanfm && \ + # A virtual framebuffer for running GUI applications without a physical display. + xvfb \ + # A terminal emulator for X. + xterm \ + # A command-line tool for automating X11 applications (e.g., simulating keyboard/mouse inputs). + xdotool \ + # A command-line tool for taking screenshots. + scrot \ + # A suite for image manipulation — needed for scaling images. + imagemagick \ + sudo \ + # A lightweight window manager. + mutter \ + # A VNC server for sharing X11 desktops. + x11vnc \ + # A web based VNC client + novnc \ + # A WebSocket to TCP proxy/bridge for noVNC + websockify \ + # Python reqs + python3 \ + python3-pip \ + # Network tools + # Provides networking tools like ifconfig, netstat, etc. + net-tools \ + # A versatile networking tool for debugging, port scanning, and more. + netcat && \ apt-get clean +# Userland apps +RUN apt-get install -y --no-install-recommends \ + # A lightweight PDF viewer. + xpdf \ + # A simple image viewer. + xpaint \ + # A lightweight taskbar for graphical desktops. + tint2 \ + # A calculator application. + galculator \ + # A lightweight file manager. + pcmanfm && \ + apt-get clean + +# install Firefox +RUN apt-get install -y software-properties-common && \ + add-apt-repository ppa:mozillateam/ppa && \ + apt-get update && \ + apt-get install -y --no-install-recommends firefox-esr && \ + apt-get clean + +# install VS Code +RUN apt-get install -y \ + gpg \ + wget \ + apt-transport-https \ + software-properties-common && \ + wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg && \ + install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg && \ + sh -c 'echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list' && \ + apt-get update && \ + apt-get install -y code && \ + apt-get clean + +# configure noVNC +RUN ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html + # setup user ENV USERNAME=computeruse ENV HOME=/home/$USERNAME @@ -65,14 +81,6 @@ RUN echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers USER computeruse WORKDIR $HOME -# install VS Code -RUN wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add - && \ - sudo add-apt-repository "deb https://packages.microsoft.com/repos/vscode stable main" && \ - sudo apt install -y code - -# configure noVNC -RUN sudo ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html - # configure Firefox to skip all 'first run' UI RUN mkdir -p $HOME/.mozilla/firefox-esr/profile.default && \ echo 'user_pref("browser.startup.homepage_override.mstone", "ignore");' >> $HOME/.mozilla/firefox-esr/profile.default/user.js && \ From f81345b0cb1c4efee6c8faec1dd6a3b902aa4b0d Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Thu, 16 Jan 2025 13:23:25 -0500 Subject: [PATCH 36/41] configure novnc url to scale the screen to fit the browser window --- src/inspect_ai/_display/textual/widgets/port_mappings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inspect_ai/_display/textual/widgets/port_mappings.py b/src/inspect_ai/_display/textual/widgets/port_mappings.py index 8f585db82..10f850e02 100644 --- a/src/inspect_ai/_display/textual/widgets/port_mappings.py +++ b/src/inspect_ai/_display/textual/widgets/port_mappings.py @@ -99,7 +99,7 @@ def get_url( ) -> str | None: if service is not None: if service == "noVNC": - return f"http://localhost:{host_port}?view_only=true&autoconnect=true" + return f"http://localhost:{host_port}?view_only=true&autoconnect=true&resize=scale" if service.startswith("HTTP"): return f"https://localhost:{host_port}" From 319fe3a446ed3009243bdda8975af8bb85b06f17 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Thu, 16 Jan 2025 13:50:12 -0500 Subject: [PATCH 37/41] Update the screen dimensions and clarify w/comment. --- src/inspect_ai/model/_providers/anthropic.py | 8 +++++++- .../tool/_tools/_computer/_resources/Dockerfile | 2 +- .../_computer/_resources/computer_tool/_x11_client.py | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/inspect_ai/model/_providers/anthropic.py b/src/inspect_ai/model/_providers/anthropic.py index 5974283af..2b4f77b79 100644 --- a/src/inspect_ai/model/_providers/anthropic.py +++ b/src/inspect_ai/model/_providers/anthropic.py @@ -394,7 +394,13 @@ def computer_use_tool_param(tool: ToolInfo) -> ComputerUseToolParam | None: return ComputerUseToolParam( type="computer_20241022", name="computer", - display_width_px=1024, + # Note: The dimensions passed here for display_width_px and display_height_px should + # match the dimensions of screenshots returned by the tool. + # Those dimensions will always be one of the values in MAX_SCALING_TARGETS + # in _x11_client.py. + # TODO: enhance this code to calculate the dimensions based on the scaled screen + # size used by the container. + display_width_px=1366, display_height_px=768, display_number=1, ) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile index 7907077a7..cc851938a 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile +++ b/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile @@ -100,8 +100,8 @@ EXPOSE 5900 EXPOSE 6080 ARG DISPLAY_NUM=1 -ARG HEIGHT=1080 ARG WIDTH=1920 +ARG HEIGHT=1080 ENV DISPLAY_NUM=$DISPLAY_NUM ENV HEIGHT=$HEIGHT ENV WIDTH=$WIDTH diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py index f632cedd2..bd1bfe2de 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py @@ -76,7 +76,7 @@ class X11Client: height: int display_num: int | None # TODO: Complete plumbing this or remove it - color_count: ColorCount | None = 64 + color_count: ColorCount | None = 256 _screenshot_delay = 2.0 _scaling_enabled = True From e7876768ae4f008b4d01a59e22c853175cec374c Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Thu, 16 Jan 2025 14:16:49 -0500 Subject: [PATCH 38/41] Models sometimes send multiple keys with the key command. e.g. "ctrl+k ctrl+o". Support that. --- .../_tools/_computer/_resources/computer_tool/_x11_client.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py index bd1bfe2de..48a72018f 100644 --- a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py +++ b/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py @@ -141,7 +141,9 @@ async def __call__( raise ToolError(output=f"{text} must be a string") if action == "key": - return await self.shell(f"{self.xdotool} key -- {shlex.quote(text)}") + return await self.shell( + f"{self.xdotool} key -- {' '.join(shlex.quote(part) for part in text.split())}" + ) elif action == "type": results: list[ToolResult] = [] for chunk in chunks(text, TYPING_GROUP_SIZE): From 19532c7b4fcd5a89fe7e7bdd4b5b17929cbeb228 Mon Sep 17 00:00:00 2001 From: Eric Patey <> Date: Thu, 16 Jan 2025 14:37:07 -0500 Subject: [PATCH 39/41] Move computer tool into .tool.beta namespace and rename internal image name. --- docs/tools.qmd | 12 ++++++------ examples/computer/compose.yaml | 2 +- examples/computer/computer.py | 2 +- examples/intervention/computer/compose.yaml | 5 ++--- examples/intervention/intervention.py | 3 ++- src/inspect_ai/tool/__init__.py | 2 -- src/inspect_ai/tool/beta/__init__.py | 5 +++++ .../tool/{_tools => beta}/_computer/__init__.py | 0 .../tool/{_tools => beta}/_computer/_common.py | 4 ++-- .../tool/{_tools => beta}/_computer/_computer.py | 0 .../{_tools => beta}/_computer/_computer_split.py | 0 .../{_tools => beta}/_computer/_resources/Dockerfile | 0 .../_computer/_resources/computer_tool/__init__.py | 0 .../_computer/_resources/computer_tool/_logger.py | 0 .../_computer/_resources/computer_tool/_run.py | 0 .../_resources/computer_tool/_tool_result.py | 0 .../_resources/computer_tool/_x11_client.py | 0 .../_resources/computer_tool/computer_tool.py | 0 .../_resources/computer_tool/requirements.txt | 0 .../.config/tint2/applications/code.desktop | 0 .../tint2/applications/firefox-custom.desktop | 0 .../.config/tint2/applications/terminal.desktop | 0 .../_resources/image_home_dir/.config/tint2/tint2rc | 0 .../_computer/_resources/image_home_dir/README.md | 0 .../_resources/image_home_dir/entrypoint.sh | 0 .../_resources/image_home_dir/mutter_startup.sh | 0 .../_resources/image_home_dir/novnc_startup.sh | 0 .../_resources/image_home_dir/tint2_startup.sh | 0 .../_resources/image_home_dir/x11vnc_startup.sh | 0 .../_resources/image_home_dir/xvfb_startup.sh | 0 src/inspect_ai/util/_sandbox/docker/internal.py | 8 ++++++-- 31 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 src/inspect_ai/tool/beta/__init__.py rename src/inspect_ai/tool/{_tools => beta}/_computer/__init__.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_common.py (96%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_computer.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_computer_split.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/Dockerfile (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/__init__.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/_logger.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/_run.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/_tool_result.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/_x11_client.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/computer_tool.py (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/computer_tool/requirements.txt (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/.config/tint2/tint2rc (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/README.md (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/entrypoint.sh (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/mutter_startup.sh (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/novnc_startup.sh (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/tint2_startup.sh (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/x11vnc_startup.sh (100%) rename src/inspect_ai/tool/{_tools => beta}/_computer/_resources/image_home_dir/xvfb_startup.sh (100%) diff --git a/docs/tools.qmd b/docs/tools.qmd index eb66a1672..ea420171a 100644 --- a/docs/tools.qmd +++ b/docs/tools.qmd @@ -438,12 +438,12 @@ The computer tool is based on the Anthropic [Computer Use](https://docs.anthropi ### Configuration -The `computer()` tool runs within a Docker container. To use it with a task you need to reference the `inspect-computer-tool` image in your Docker compose file. For example: +The `computer()` tool runs within a Docker container. To use it with a task you need to reference the `inspect-computer-tool-beta` image in your Docker compose file. For example: ``` {.yaml filename="compose.yaml"} services: default: - image: inspect-computer-tool + image: inspect-computer-tool-beta ``` You can configure the container to not have Internet access as follows: @@ -451,13 +451,13 @@ You can configure the container to not have Internet access as follows: ``` {.yaml filename="compose.yaml"} services: default: - image: inspect-computer-tool + image: inspect-computer-tool-beta network_mode: none ``` Note that if you'd like to be able to view the model's interactions with the computer desktop in realtime, you will need to also do some port mapping to enable a VNC connection with the container. See the [VNC Client](#vnc-client) section below for details on how to do this. -The `inspect-computer-tool` image is based on the [ubuntu:22.04](https://hub.docker.com/layers/library/ubuntu/22.04/images/sha256-965fbcae990b0467ed5657caceaec165018ef44a4d2d46c7cdea80a9dff0d1ea?context=explore) image and includes the following additional applications pre-installed: +The `inspect-computer-tool-beta` image is based on the [ubuntu:22.04](https://hub.docker.com/layers/library/ubuntu/22.04/images/sha256-965fbcae990b0467ed5657caceaec165018ef44a4d2d46c7cdea80a9dff0d1ea?context=explore) image and includes the following additional applications pre-installed: - Firefox - VS Code @@ -475,7 +475,7 @@ A task configured to use the computer tool might look like this: from inspect_ai import Task, task from inspect_ai.scorer import match from inspect_ai.solver import generate, use_tools -from inspect_ai.tool import computer +from inspect_ai.tool.beta import computer @task def computer_task(): @@ -511,7 +511,7 @@ You can use a [VNC](https://en.wikipedia.org/wiki/VNC) connection to the contain ``` {.yaml filename="compose.yaml"} services: default: - image: inspect-computer-tool + image: inspect-computer-tool-beta ports: - "5900" - "6080" diff --git a/examples/computer/compose.yaml b/examples/computer/compose.yaml index 4c3057516..7e2de2e8c 100644 --- a/examples/computer/compose.yaml +++ b/examples/computer/compose.yaml @@ -1,7 +1,7 @@ services: default: # Temporary internal image until the official one is available - image: inspect-computer-tool + image: inspect-computer-tool-beta init: true # If you only launch a single container, you can vnc into that container by using diff --git a/examples/computer/computer.py b/examples/computer/computer.py index 9e59bf951..4abc07373 100644 --- a/examples/computer/computer.py +++ b/examples/computer/computer.py @@ -3,7 +3,7 @@ from inspect_ai.scorer import includes from inspect_ai.solver import system_message from inspect_ai.solver._basic_agent import basic_agent -from inspect_ai.tool import computer +from inspect_ai.tool.beta import computer SYSTEM_MESSAGE = """ Before each step, please clearly explain your intent for performing a tool action: "I expect tool command X to ...". diff --git a/examples/intervention/computer/compose.yaml b/examples/intervention/computer/compose.yaml index 6c0ffa7fd..2b304df89 100644 --- a/examples/intervention/computer/compose.yaml +++ b/examples/intervention/computer/compose.yaml @@ -1,10 +1,9 @@ services: default: # Temporary internal image until the official one is available - image: inspect-computer-tool + image: inspect-computer-tool-beta init: true - # Dynamically assign ports for vnc and novnc + # Dynamically assign ports for vnc and novnc ports: - "5900" - "6080" - diff --git a/examples/intervention/intervention.py b/examples/intervention/intervention.py index e012a7189..5749ed98b 100644 --- a/examples/intervention/intervention.py +++ b/examples/intervention/intervention.py @@ -14,7 +14,8 @@ use_tools, ) from inspect_ai.solver._chain import chain -from inspect_ai.tool import bash, computer, python +from inspect_ai.tool import bash, python +from inspect_ai.tool.beta import computer from inspect_ai.util import input_screen Mode = Literal["shell", "computer"] diff --git a/src/inspect_ai/tool/__init__.py b/src/inspect_ai/tool/__init__.py index 8bc0cccd9..c205e3e1e 100644 --- a/src/inspect_ai/tool/__init__.py +++ b/src/inspect_ai/tool/__init__.py @@ -20,7 +20,6 @@ from ._tool_info import ToolInfo from ._tool_params import ToolParam, ToolParams from ._tool_with import tool_with -from ._tools._computer import computer from ._tools._execute import bash, python from ._tools._web_browser import web_browser from ._tools._web_search import web_search @@ -30,7 +29,6 @@ "python", "web_browser", "web_search", - "computer", "tool", "tool_with", "Tool", diff --git a/src/inspect_ai/tool/beta/__init__.py b/src/inspect_ai/tool/beta/__init__.py new file mode 100644 index 000000000..a4ea44dbb --- /dev/null +++ b/src/inspect_ai/tool/beta/__init__.py @@ -0,0 +1,5 @@ +from ._computer import computer + +__all__ = [ + "computer", +] diff --git a/src/inspect_ai/tool/_tools/_computer/__init__.py b/src/inspect_ai/tool/beta/_computer/__init__.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/__init__.py rename to src/inspect_ai/tool/beta/_computer/__init__.py diff --git a/src/inspect_ai/tool/_tools/_computer/_common.py b/src/inspect_ai/tool/beta/_computer/_common.py similarity index 96% rename from src/inspect_ai/tool/_tools/_computer/_common.py rename to src/inspect_ai/tool/beta/_computer/_common.py index 3d38b3275..63329fe69 100644 --- a/src/inspect_ai/tool/_tools/_computer/_common.py +++ b/src/inspect_ai/tool/beta/_computer/_common.py @@ -123,12 +123,12 @@ async def computer_sandbox() -> SandboxEnvironment: else: raise PrerequisiteError( dedent(""" - The computer tool service was not found in any of the sandboxes for this sample. Please add the computer tool service to your configuration. For example, the following Docker compose file uses the (currently internal) inspect-computer-tool image as its default sandbox: + The computer tool service was not found in any of the sandboxes for this sample. Please add the computer tool service to your configuration. For example, the following Docker compose file uses the (currently internal) inspect-computer-tool-beta image as its default sandbox: services: default: # Temporary internal image until the official one is available - image: "inspect-computer-tool" + image: "inspect-computer-tool-beta" init: true """).strip() ) diff --git a/src/inspect_ai/tool/_tools/_computer/_computer.py b/src/inspect_ai/tool/beta/_computer/_computer.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_computer.py rename to src/inspect_ai/tool/beta/_computer/_computer.py diff --git a/src/inspect_ai/tool/_tools/_computer/_computer_split.py b/src/inspect_ai/tool/beta/_computer/_computer_split.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_computer_split.py rename to src/inspect_ai/tool/beta/_computer/_computer_split.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile b/src/inspect_ai/tool/beta/_computer/_resources/Dockerfile similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/Dockerfile rename to src/inspect_ai/tool/beta/_computer/_resources/Dockerfile diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/__init__.py b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/__init__.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/__init__.py rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/__init__.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_logger.py b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_logger.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_logger.py rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_logger.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_run.py b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_run.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_run.py rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_run.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_tool_result.py b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_tool_result.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_tool_result.py rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_tool_result.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_x11_client.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/_x11_client.py rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/_x11_client.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/computer_tool.py b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/computer_tool.py similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/computer_tool.py rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/computer_tool.py diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/requirements.txt b/src/inspect_ai/tool/beta/_computer/_resources/computer_tool/requirements.txt similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/computer_tool/requirements.txt rename to src/inspect_ai/tool/beta/_computer/_resources/computer_tool/requirements.txt diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/applications/code.desktop diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/applications/firefox-custom.desktop diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/applications/terminal.desktop diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/tint2rc similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/.config/tint2/tint2rc rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/.config/tint2/tint2rc diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/README.md b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/README.md similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/README.md rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/README.md diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/entrypoint.sh similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/entrypoint.sh rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/entrypoint.sh diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/mutter_startup.sh b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/mutter_startup.sh similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/mutter_startup.sh rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/mutter_startup.sh diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/novnc_startup.sh b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/novnc_startup.sh similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/novnc_startup.sh rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/novnc_startup.sh diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/tint2_startup.sh b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/tint2_startup.sh similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/tint2_startup.sh rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/tint2_startup.sh diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/x11vnc_startup.sh b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/x11vnc_startup.sh similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/x11vnc_startup.sh rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/x11vnc_startup.sh diff --git a/src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/xvfb_startup.sh b/src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/xvfb_startup.sh similarity index 100% rename from src/inspect_ai/tool/_tools/_computer/_resources/image_home_dir/xvfb_startup.sh rename to src/inspect_ai/tool/beta/_computer/_resources/image_home_dir/xvfb_startup.sh diff --git a/src/inspect_ai/util/_sandbox/docker/internal.py b/src/inspect_ai/util/_sandbox/docker/internal.py index 6130b7916..2fe96102d 100644 --- a/src/inspect_ai/util/_sandbox/docker/internal.py +++ b/src/inspect_ai/util/_sandbox/docker/internal.py @@ -6,7 +6,7 @@ INSPECT_WEB_BROWSER_IMAGE_DOCKERHUB = "aisiuk/inspect-web-browser-tool" INSPECT_WEB_BROWSER_IMAGE = "inspect_web_browser" -INSPECT_COMPUTER_IMAGE = "inspect-computer-tool" +INSPECT_COMPUTER_BETA_IMAGE = "inspect-computer-tool-beta" INTERNAL_IMAGES = { INSPECT_WEB_BROWSER_IMAGE: PKG_PATH @@ -14,7 +14,11 @@ / "_tools" / "_web_browser" / "_resources", - INSPECT_COMPUTER_IMAGE: PKG_PATH / "tool" / "_tools" / "_computer" / "_resources", + INSPECT_COMPUTER_BETA_IMAGE: PKG_PATH + / "tool" + / "beta" + / "_computer" + / "_resources", } From ffbc94094b10cd4610913a074d1017685b4a9217 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Thu, 16 Jan 2025 15:13:22 -0500 Subject: [PATCH 40/41] doc tweaks --- docs/tools.qmd | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/tools.qmd b/docs/tools.qmd index ea420171a..01065ff0c 100644 --- a/docs/tools.qmd +++ b/docs/tools.qmd @@ -422,19 +422,19 @@ CMD ["python3", "/app/web_browser/web_server.py"] Note that all of the Python files in the [\_resources](https://github.com/UKGovernmentBEIS/inspect_ai/blob/main/src/inspect_ai/tool/_tools/_web_browser/_resources/) directory alongside the `Dockerfile` need to be available for copying when building the container. -## Computer {#sec-computer} +## Computer (Beta) {#sec-computer} ::: {.callout-note appearance="simple"} -The computer tool described below is currently available only in the development version of Inspect. To install the development version from GitHub: +The beta version of the computer tool described below is currently available only in the development version of Inspect. To install the development version: ``` bash pip install git+https://github.com/UKGovernmentBEIS/inspect_ai ``` ::: -The `computer()` tool provides models with a computer desktop environment along with the ability to view the screen and perform mouse and keyboard gestures. +The `computer()` tool provides models with a computer desktop environment along with the ability to view the screen and perform mouse and keyboard gestures. The computer tool is based on the Anthropic [Computer Use Beta](https://docs.anthropic.com/en/docs/build-with-claude/computer-use) reference implementation and works with any model that supports image input. -The computer tool is based on the Anthropic [Computer Use](https://docs.anthropic.com/en/docs/build-with-claude/computer-use) reference implementation. and works with any model that supports image input. The tool's schema is based entirely on the standard Anthropoic [computer tool-type](https://docs.anthropic.com/en/docs/build-with-claude/computer-use#computer-tool) and when using Claude 3.5 the native Claude computer tool is utilised. + The current release of the computer tool is a beta version (exported from the `inspect_ai.tool.beta` module). We expect to finalise the interface and move it into the main `inspect_ai.tool` module over the next several weeks. ### Configuration @@ -492,13 +492,13 @@ def computer_task(): Two of the Inspect examples demonstrate basic computer use: -- [computer](https://github.com/epatey/inspect_ai/blob/computer/examples/computer/computer.py) — Three simple computing tasks as a minimal demonstration of computer use. +- [computer](https://github.com/UKGovernmentBEIS/inspect_ai/tree/main/examples/computer/computer.py) — Three simple computing tasks as a minimal demonstration of computer use. ``` bash inspect eval examples/computer ``` -- [intervention](https://github.com/epatey/inspect_ai/blob/computer/examples/intervention/intervention.py) — Computer task driven interactively by a human operator. +- [intervention](https://github.com/UKGovernmentBEIS/inspect_ai/tree/main/examples/intervention/intervention.py) — Computer task driven interactively by a human operator. ``` bash inspect eval examples/intervention -T mode=computer --display conversation @@ -567,6 +567,17 @@ You can apply this policy using the `--approval` commmand line option: inspect eval computer.py --approval approval.yaml ``` +### Tool Binding + +The computer tool's schema is based on the standard Anthropoic [computer tool-type](https://docs.anthropic.com/en/docs/build-with-claude/computer-use#computer-tool). When using Claude 3.5 the coputer tool will automatically bind to the native Claude computer tool definition. This presumably provides improved performance due to fine tuning on the use of the tool but we have not verified this. + +If you want to experiement with bypassing the native Claude computer tool type and just register the computer tool as a normal function based tool then specify the `--no-internal-tools` generation option as follows: + +```bash +inspect eval computer.py --no-internal-tools +``` + + ## Web Search {#sec-web-search} The `web_search()` tool provides models the ability to enhance their context window by performing a search. By default web searches retrieve 10 results from a provider, uses a model to determine if the contents is relevant then returns the top 3 relevant search results to the main model. Here is the definition of the `web_search()` function: From 88622a15335eda4f13f8f277c62e6a11d2d161f8 Mon Sep 17 00:00:00 2001 From: "J.J. Allaire" Date: Thu, 16 Jan 2025 16:46:38 -0500 Subject: [PATCH 41/41] ruff --- src/inspect_ai/util/_sandbox/docker/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inspect_ai/util/_sandbox/docker/docker.py b/src/inspect_ai/util/_sandbox/docker/docker.py index 50b878deb..223471a16 100644 --- a/src/inspect_ai/util/_sandbox/docker/docker.py +++ b/src/inspect_ai/util/_sandbox/docker/docker.py @@ -443,7 +443,7 @@ async def connection(self) -> SandboxConnection: container, ], ports=await get_ports_info(container), - container=container + container=container, ) # error (not currently running) else: