ActionExecutor
inside the container, setting up necessary components like a bash shell and loading any specified pluginsopenhands/runtime/impl/action_execution/action_execution_client.py
; runtimes: openhands/runtime/impl/docker/docker_runtime.py
, openhands/runtime/impl/local/local_runtime.py
) communicates with the action execution server over RESTful API, sending actions and receiving observationsoh_v{openhands_version}_{base_image}
(e.g.: oh_v0.9.9_nikolaik_s_python-nodejs_t_python3.12-nodejs22
)oh_v{openhands_version}_{16_digit_lock_hash}
(e.g.: oh_v0.9.9_1234567890abcdef
)oh_v{openhands_version}_{16_digit_lock_hash}_{16_digit_source_hash}
(e.g.: oh_v0.9.9_1234567890abcdef_1234567890abcdef
)nikolaik/python-nodejs:python3.12-nodejs22
)pyproject.toml
included in the image.poetry.lock
included in the image.poetry install
and
apt-get
) except a final operation to copy the current source code. The new image is tagged with a
source tag only.runtime:oh_v0.9.3_1234567890abcdef
) always points to the latest build for a particular base image, dependency, and OpenHands version combination<name>
:/container/path[:mode]” or any non-absolute host spec treated as a named volumePlugin
classopenhands/runtime/plugins/__init__.py
via ALL_PLUGINS
Agent.sandbox_plugins: list[PluginRequirement]
. Users can specify which plugins to load when initializing the runtime