From ea2daf63c467ef625e0d776009faab99d87f5039 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 08:21:11 -0500 Subject: [PATCH 01/14] Add trixie image flavor from our nikolaik fork --- .github/workflows/ghcr-build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ghcr-build.yml b/.github/workflows/ghcr-build.yml index 82bf9ff6b32e..3b31799484f6 100644 --- a/.github/workflows/ghcr-build.yml +++ b/.github/workflows/ghcr-build.yml @@ -41,11 +41,13 @@ jobs: if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then json=$(jq -n -c '[ { image: "nikolaik/python-nodejs:python3.12-nodejs22", tag: "nikolaik" }, + { image: "ghcr.io/all-hands-ai/python-nodejs:python3.13-nodejs22-trixie", tag: "trixie" }, { image: "ubuntu:24.04", tag: "ubuntu" } ]') else json=$(jq -n -c '[ { image: "nikolaik/python-nodejs:python3.12-nodejs22", tag: "nikolaik" }, + { image: "ghcr.io/all-hands-ai/python-nodejs:python3.13-nodejs22-trixie", tag: "trixie" }, { image: "ubuntu:24.04", tag: "ubuntu" } ]') fi From 3b238babda942cb470e9af3daac6dc461241ceaa Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 12:09:11 -0500 Subject: [PATCH 02/14] Remove DOCKER_IMAGE_SOURCE_TAG --- .github/workflows/ghcr-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ghcr-build.yml b/.github/workflows/ghcr-build.yml index 3b31799484f6..23d91d562caf 100644 --- a/.github/workflows/ghcr-build.yml +++ b/.github/workflows/ghcr-build.yml @@ -138,6 +138,9 @@ jobs: if: github.event.pull_request.head.repo.fork != true shell: bash run: | + # This had a slash in it. Probably useless anyway? + unset DOCKER_IMAGE_SOURCE_TAG + ./containers/build.sh -i runtime -o ${{ env.REPO_OWNER }} -t ${{ matrix.base_image.tag }} --dry DOCKER_BUILD_JSON=$(jq -c . < docker-build-dry.json) From 1d471a52fae26304d4aa02e0f0adca5f6018e7d0 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 13:30:51 -0500 Subject: [PATCH 03/14] Strip _ from tags in more cases --- .github/workflows/ghcr-build.yml | 2 -- openhands/runtime/utils/runtime_build.py | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ghcr-build.yml b/.github/workflows/ghcr-build.yml index 23d91d562caf..3da073322692 100644 --- a/.github/workflows/ghcr-build.yml +++ b/.github/workflows/ghcr-build.yml @@ -138,8 +138,6 @@ jobs: if: github.event.pull_request.head.repo.fork != true shell: bash run: | - # This had a slash in it. Probably useless anyway? - unset DOCKER_IMAGE_SOURCE_TAG ./containers/build.sh -i runtime -o ${{ env.REPO_OWNER }} -t ${{ matrix.base_image.tag }} --dry diff --git a/openhands/runtime/utils/runtime_build.py b/openhands/runtime/utils/runtime_build.py index ada1a148af8f..7c66f7c9cd28 100644 --- a/openhands/runtime/utils/runtime_build.py +++ b/openhands/runtime/utils/runtime_build.py @@ -89,9 +89,9 @@ def get_runtime_image_repo_and_tag(base_image: str) -> tuple[str, str]: # Hash the repo if it's too long if len(repo) > 32: repo_hash = hashlib.md5(repo[:-24].encode()).hexdigest()[:8] - repo = f'{repo_hash}_{repo[-24:]}' # Use 8 char hash + last 24 chars - else: - repo = repo.replace('/', '_s_') + + repo = f'{repo_hash}_{repo[-24:]}' # Use 8 char hash + last 24 chars + repo = repo.replace('/', '_s_') new_tag = f'oh_v{oh_version}_image_{repo}_tag_{tag}' From b6e87a1566fdfb6c7df458c4b1eccc3bdd712c25 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 13:45:10 -0500 Subject: [PATCH 04/14] Make dockerfile general with package name for libgl --- openhands/runtime/utils/runtime_templates/Dockerfile.j2 | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 index 896f55b30a02..53a556940ed6 100644 --- a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 +++ b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 @@ -24,12 +24,8 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends \ wget curl ca-certificates sudo apt-utils git jq tmux build-essential ripgrep ffmpeg \ coreutils util-linux procps findutils grep sed \ - {%- if (base_image.endswith(':latest') or base_image.endswith(':24.04') or ('mswebench' in base_image)) -%} - libgl1 \ - {%- else %} - libgl1-mesa-glx \ - {% endif -%} libasound2-plugins libatomic1 \ + (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) \ # Install Docker dependencies apt-transport-https ca-certificates curl gnupg lsb-release && \ curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ From 2491c1e71c65ba8079e00d8ec3e0d19f8e48c59b Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 13:51:17 -0500 Subject: [PATCH 05/14] Fix bash syntax --- openhands/runtime/utils/runtime_templates/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 index 53a556940ed6..f1c9903e5732 100644 --- a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 +++ b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 @@ -24,8 +24,8 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends \ wget curl ca-certificates sudo apt-utils git jq tmux build-essential ripgrep ffmpeg \ coreutils util-linux procps findutils grep sed \ - libasound2-plugins libatomic1 \ - (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) \ + libasound2-plugins libatomic1 && \ + (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) && \ # Install Docker dependencies apt-transport-https ca-certificates curl gnupg lsb-release && \ curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ From 93f500ec2e690382f23755b1dd23c6918354ede0 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 13:56:13 -0500 Subject: [PATCH 06/14] Fix syntax --- openhands/runtime/utils/runtime_templates/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 index f1c9903e5732..83ecab3481a9 100644 --- a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 +++ b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 @@ -27,7 +27,7 @@ RUN apt-get update && \ libasound2-plugins libatomic1 && \ (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) && \ # Install Docker dependencies - apt-transport-https ca-certificates curl gnupg lsb-release && \ + apt-get install -y --no-install-recommends apt-transport-https ca-certificates curl gnupg lsb-release && \ curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ TZ=Etc/UTC DEBIAN_FRONTEND=noninteractive \ {%- if ('mswebench' in base_image) -%} From fd6b250667e836ccb309567d3dba3b98960439cf Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 14:17:45 -0500 Subject: [PATCH 07/14] Make libgl1-mesa-glx conditional again --- openhands/runtime/utils/runtime_templates/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 index 83ecab3481a9..112b10465234 100644 --- a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 +++ b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 @@ -42,8 +42,8 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends \ wget curl ca-certificates sudo apt-utils git jq tmux build-essential ripgrep ffmpeg \ coreutils util-linux procps findutils grep sed \ - libgl1-mesa-glx \ - libasound2-plugins libatomic1 \ + libasound2-plugins libatomic1 && \ + (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) && \ # Install Docker dependencies apt-transport-https ca-certificates curl gnupg lsb-release {% endif %} From 27a3670f53e5a7b0c2866c8622f890c267f8cfcd Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 14:48:20 -0500 Subject: [PATCH 08/14] Syntax is hard --- openhands/runtime/utils/runtime_templates/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 index 112b10465234..51c0de535f3c 100644 --- a/openhands/runtime/utils/runtime_templates/Dockerfile.j2 +++ b/openhands/runtime/utils/runtime_templates/Dockerfile.j2 @@ -43,9 +43,9 @@ RUN apt-get update && \ wget curl ca-certificates sudo apt-utils git jq tmux build-essential ripgrep ffmpeg \ coreutils util-linux procps findutils grep sed \ libasound2-plugins libatomic1 && \ - (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) && \ + (apt-get install -y --no-install-recommends libgl1 || apt-get install -y --no-install-recommends libgl1-mesa-glx) && \ # Install Docker dependencies - apt-transport-https ca-certificates curl gnupg lsb-release + apt-get install -y --no-install-recommends apt-transport-https ca-certificates curl gnupg lsb-release {% endif %} {% if (('ubuntu' in base_image) or ('mswebench' in base_image)) %} From af590592a4eeae95d2af3a713729f81adc349612 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 15:29:51 -0500 Subject: [PATCH 09/14] Upgrade app image to trixie --- containers/app/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/app/Dockerfile b/containers/app/Dockerfile index 87f9adfcd3e4..f4d83865b959 100644 --- a/containers/app/Dockerfile +++ b/containers/app/Dockerfile @@ -9,7 +9,7 @@ RUN npm ci COPY frontend ./ RUN npm run build -FROM python:3.12.10-slim AS base +FROM python:3.12.11-slim-trixie AS base FROM base AS backend-builder WORKDIR /app From 9be16c10b613f0df5bae5bd460d6535505d8b0fc Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 15:32:52 -0500 Subject: [PATCH 10/14] update frontend builder to trixie --- containers/app/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/app/Dockerfile b/containers/app/Dockerfile index f4d83865b959..288bac110e6c 100644 --- a/containers/app/Dockerfile +++ b/containers/app/Dockerfile @@ -1,5 +1,5 @@ ARG OPENHANDS_BUILD_VERSION=dev -FROM node:24.3.0-bookworm-slim AS frontend-builder +FROM node:24.8-trixie-slim AS frontend-builder WORKDIR /app From a171595de4628abbcf819d474eeefcebf1258e95 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 16:12:11 -0500 Subject: [PATCH 11/14] Try python 3.13 --- containers/app/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/app/Dockerfile b/containers/app/Dockerfile index 288bac110e6c..372e5b1ef691 100644 --- a/containers/app/Dockerfile +++ b/containers/app/Dockerfile @@ -9,7 +9,7 @@ RUN npm ci COPY frontend ./ RUN npm run build -FROM python:3.12.11-slim-trixie AS base +FROM python:3.13.7-slim-trixie AS base FROM base AS backend-builder WORKDIR /app From aa60329361bc8b21431c7b88c33ba074132dfd2f Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 19:51:03 -0500 Subject: [PATCH 12/14] Bump playwright for dep info --- poetry.lock | 22 +++++++++++----------- pyproject.toml | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index 33880f0fbdff..ebea4dd14867 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "aiofiles" @@ -7078,20 +7078,20 @@ type = ["mypy (>=1.14.1)"] [[package]] name = "playwright" -version = "1.52.0" +version = "1.55.0" description = "A high-level API to automate web browsers" optional = false python-versions = ">=3.9" groups = ["main", "evaluation", "test"] files = [ - {file = "playwright-1.52.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:19b2cb9d4794062008a635a99bd135b03ebb782d460f96534a91cb583f549512"}, - {file = "playwright-1.52.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0797c0479cbdc99607412a3c486a3a2ec9ddc77ac461259fd2878c975bcbb94a"}, - {file = "playwright-1.52.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:7223960b7dd7ddeec1ba378c302d1d09733b8dac438f492e9854c85d3ca7144f"}, - {file = "playwright-1.52.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:d010124d24a321e0489a8c0d38a3971a7ca7656becea7656c9376bfea7f916d4"}, - {file = "playwright-1.52.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4173e453c43180acc60fd77ffe1ebee8d0efbfd9986c03267007b9c3845415af"}, - {file = "playwright-1.52.0-py3-none-win32.whl", hash = "sha256:cd0bdf92df99db6237a99f828e80a6a50db6180ef8d5352fc9495df2c92f9971"}, - {file = "playwright-1.52.0-py3-none-win_amd64.whl", hash = "sha256:dcbf75101eba3066b7521c6519de58721ea44379eb17a0dafa94f9f1b17f59e4"}, - {file = "playwright-1.52.0-py3-none-win_arm64.whl", hash = "sha256:9d0085b8de513de5fb50669f8e6677f0252ef95a9a1d2d23ccee9638e71e65cb"}, + {file = "playwright-1.55.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:d7da108a95001e412effca4f7610de79da1637ccdf670b1ae3fdc08b9694c034"}, + {file = "playwright-1.55.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8290cf27a5d542e2682ac274da423941f879d07b001f6575a5a3a257b1d4ba1c"}, + {file = "playwright-1.55.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:25b0d6b3fd991c315cca33c802cf617d52980108ab8431e3e1d37b5de755c10e"}, + {file = "playwright-1.55.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c6d4d8f6f8c66c483b0835569c7f0caa03230820af8e500c181c93509c92d831"}, + {file = "playwright-1.55.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29a0777c4ce1273acf90c87e4ae2fe0130182100d99bcd2ae5bf486093044838"}, + {file = "playwright-1.55.0-py3-none-win32.whl", hash = "sha256:29e6d1558ad9d5b5c19cbec0a72f6a2e35e6353cd9f262e22148685b86759f90"}, + {file = "playwright-1.55.0-py3-none-win_amd64.whl", hash = "sha256:7eb5956473ca1951abb51537e6a0da55257bb2e25fc37c2b75af094a5c93736c"}, + {file = "playwright-1.55.0-py3-none-win_arm64.whl", hash = "sha256:012dc89ccdcbd774cdde8aeee14c08e0dd52ddb9135bf10e9db040527386bd76"}, ] [package.dependencies] @@ -11887,4 +11887,4 @@ third-party-runtimes = ["daytona", "e2b-code-interpreter", "modal", "runloop-api [metadata] lock-version = "2.1" python-versions = "^3.12,<3.14" -content-hash = "6f1c757233a5d2df1b17f11787b8ad29da98c12a28a07644bffb6fddf4618798" +content-hash = "566b34b25e55ede53da7dd3917e9039a33930d55bfaf24aa84bb56819596604b" diff --git a/pyproject.toml b/pyproject.toml index eb1177c5efe7..f7f0eefb956a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ uvicorn = "*" numpy = "*" json-repair = "*" browsergym-core = "0.13.3" # integrate browsergym-core as the browsing interface +playwright = "^1.55.0" html2text = "*" deprecated = "*" pexpect = "*" From c098d894f7c202a32aed1eb0629b94c199b57acb Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Mon, 29 Sep 2025 13:58:08 -0500 Subject: [PATCH 13/14] Remove Trixie from PR build --- .github/workflows/ghcr-build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ghcr-build.yml b/.github/workflows/ghcr-build.yml index 3da073322692..14e953390338 100644 --- a/.github/workflows/ghcr-build.yml +++ b/.github/workflows/ghcr-build.yml @@ -41,7 +41,6 @@ jobs: if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then json=$(jq -n -c '[ { image: "nikolaik/python-nodejs:python3.12-nodejs22", tag: "nikolaik" }, - { image: "ghcr.io/all-hands-ai/python-nodejs:python3.13-nodejs22-trixie", tag: "trixie" }, { image: "ubuntu:24.04", tag: "ubuntu" } ]') else From 841e15572c165fa62f52949e7af430fdf26839c4 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 25 Sep 2025 19:59:07 -0500 Subject: [PATCH 14/14] dumb lint --- openhands/runtime/utils/runtime_build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openhands/runtime/utils/runtime_build.py b/openhands/runtime/utils/runtime_build.py index 7c66f7c9cd28..37f59487dbac 100644 --- a/openhands/runtime/utils/runtime_build.py +++ b/openhands/runtime/utils/runtime_build.py @@ -90,7 +90,7 @@ def get_runtime_image_repo_and_tag(base_image: str) -> tuple[str, str]: if len(repo) > 32: repo_hash = hashlib.md5(repo[:-24].encode()).hexdigest()[:8] - repo = f'{repo_hash}_{repo[-24:]}' # Use 8 char hash + last 24 chars + repo = f'{repo_hash}_{repo[-24:]}' # Use 8 char hash + last 24 chars repo = repo.replace('/', '_s_') new_tag = f'oh_v{oh_version}_image_{repo}_tag_{tag}'