agent-sandbox-harbor
A Harbor environment plugin that runs Harbor benchmarks (Terminal-Bench, SWE-bench, custom datasets) on Agent Sandbox pre-warmed pools — no fork of Harbor required.
Highlights:
- Zero Harbor source changes. Plugs into Harbor via the official
--environment-import-pathextension point. - Skips Template Build. Agent Sandbox uses a pre-warmed Pod pool with in-place image swap,
so the per-task Template Build step that E2B / Novita require is replaced by a single
POST /v1/sandboxescall. - Internal-mirror friendly. A configurable image-prefix rewrites
docker.io/...to your private Distribution / Harbor registry. - Bring-your-own image. An optional task-name → image map (
AGBX_IMAGE_MAP) lets you run pre-built images for any dataset — including ones whosetask.tomlhas nodocker_image(e.g. SWE-bench, where the task is a Dockerfile).
Installation
pip install 'harbor[e2b]' agent-sandbox-harbor
The plugin pulls agent-sandbox-e2b as a hard
dependency (it calls patch_e2b() at import). harbor is an optional peer dependency, so the
package can be inspected / unit-tested without it; in real usage you install harbor[e2b]
yourself.
Quick start
# 1. Set credentials (one-off)
cat > agentbox.env <<'EOF'
E2B_API_KEY=agbx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
E2B_DOMAIN=agent-sandbox-data-plane.example.com/agent-sandbox/api/data
E2B_API_URL=https://agent-sandbox-data-plane.example.com/agent-sandbox/api/e2b
AGBX_CLUSTER_ID=cluster-a
AGBX_POOL_NAME=terminal-bench-pool
AGBX_IMAGE_PREFIX=registry.internal/agent-sandbox
EOF
# 2. Run Harbor (use the plugin via the official --environment-import-path flag)
harbor run \
-d terminal-bench@2.0 \
-a oracle \
--environment-import-path agent_sandbox_harbor:AgentSandboxEnvironment \
-n 16 -y \
--env-file agentbox.env
Configuration
| Variable | Required | Description |
|---|---|---|
E2B_API_KEY |
yes | Agent Sandbox API key (agbx_...). |
AGBX_POOL_NAME |
yes | Pre-warmed pool name. |
E2B_DOMAIN |
no | Data-plane gateway, host[:port][/path]. Default is the in-cluster service. |
E2B_API_URL |
no | E2B-compatible control-plane URL, including scheme. |
AGBX_CLUSTER_ID |
no | Cluster id prefix (e.g. cluster-a). Omit for single-cluster setups. |
AGBX_IMAGE_MAP |
no | Path to a <task-name> <image> map file (one per line; = also accepted). If a task matches, that image is used verbatim. See Image selection. |
AGBX_IMAGE_PREFIX |
no | Mirror prefix applied to the task's docker_image (e.g. registry.internal/agent-sandbox). docker.io/ is stripped first. Not applied to AGBX_IMAGE_MAP values. |
AGBX_IMAGE_TAG |
no | Override the tag of the task's docker_image after rewriting. Not applied to AGBX_IMAGE_MAP values. |
AGBX_HTTPS |
no | true/false for the data-plane scheme (default true). |
AGBX_STARTUP_TIMEOUT |
no | Sandbox startup timeout, seconds (default 300). |
AGBX_READY_TIMEOUT |
no | Cold-image readiness ceiling, seconds (default 600). Large images (e.g. SWE-bench) may need more. |
e2b SDK ≥ 2.24: newer e2b SDKs reject non-
e2b_API keys client-side. Useagent-sandbox-e2b >= 0.0.4, whosepatch_e2b()neutralizes that check soagbx_keys work (needed when running onharbor >= 0.13, which pulls a newer e2b).
Image selection
The image for each task is chosen in this order:
-
AGBX_IMAGE_MAPentry — if the file maps the task name (Harbor'senvironment_name, i.e. the task / instance id) to an image, that image is used verbatim. This is how you run datasets whosetask.tomlhas nodocker_image(e.g. SWE-bench): pre-build / mirror the images once, list them here.# <task-name> <image-ref> astropy__astropy-7606 registry.internal/agentbox/swebench/sweb.eval.x86_64.astropy_1776_astropy-7606:260328 django__django-11265 registry.internal/agentbox/swebench/sweb.eval.x86_64.django_1776_django-11265:260328
-
task.tomldocker_image— if there's no map entry but the task sets[environment] docker_image(e.g. Terminal-Bench), that image is used, after optionalAGBX_IMAGE_PREFIX/AGBX_IMAGE_TAGrewriting. -
Otherwise the task is rejected. This environment only runs pre-built images — it does not build images from a Dockerfile and does not mutate a running sandbox. Datasets that ship a Dockerfile (with extra
RUNlayers) must be built/mirrored ahead of time and listed inAGBX_IMAGE_MAP.
Example: SWE-bench (Dockerfile-based dataset)
# 1. Pre-build the images the dataset's Dockerfile would produce (base + your overlay),
# push them to your registry, and write a map file:
# astropy__astropy-7606 registry.internal/.../sweb.eval.x86_64.astropy_1776_astropy-7606:<tag>
# ...
# 2. Point the plugin at it and run:
harbor run \
-d swebench-verified@1.0 \
-a oracle \
--environment-import-path agent_sandbox_harbor:AgentSandboxEnvironment \
--env-file swebench.env # contains AGBX_IMAGE_MAP=swebench_image_map.txt
How it works
AgentSandboxEnvironment subclasses Harbor's E2BEnvironment and overrides three methods:
_does_template_exist→ always returnsTrue_create_template→ no-op_create_sandbox→ callsAsyncSandbox.create(template="cluster::pool//image", secure=False, ...)
__init__ calls super().__init__() first, so Harbor's stock Dockerfile parsing still runs
(and sets self._workdir from the image's WORKDIR). The constructor then resolves the image
(see Image selection) and overrides self._template_name with the Agent
Sandbox pool shorthand cluster::pool//image.
At module import, patch_e2b() from
agent-sandbox-e2b redirects the e2b SDK to
your Agent Sandbox endpoints.
See INTEGRATION.md for full design notes, the --environment-import-path
mechanism explanation, and operational guidance.
Compatibility
Each release build is tested against the latest published versions of
harbor and e2b. The pinned upper bound in [project.optional-dependencies] is updated
automatically by the release CI to reflect the highest verified harbor version.
License
Apache 2.0.
Metadata
Release files for agent-sandbox-harbor 0.0.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_sandbox_harbor-0.0.12.tar.gz | 8.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_sandbox_harbor-0.0.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.8 kB
Release files / agent_sandbox_harbor-0.0.12.tar.gz
| Download URL | agent_sandbox_harbor-0.0.12.tar.gz |
|---|---|
| Size | 8.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad4039090c5e5348bd8efc0e375883b3a4c351f123e11461b88878781e0b3206
|
|
BLAKE2b-256 checksum How to use checksums |
175a4421ea3fcc96e39a52f504d162fb27a9cb6872a36c21f7bba029ed34aa73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / agent_sandbox_harbor-0.0.12-py3-none-any.whl
| Download URL | agent_sandbox_harbor-0.0.12-py3-none-any.whl |
|---|---|
| Size | 9.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c3635adbb6bf811a82fd5731fe8caedea429daa5b9a2e23773aea36d1522e8ab
|
|
BLAKE2b-256 checksum How to use checksums |
0958b5b5e1adfd21bd3e4bc12500122e222a1bcf076aed51e87300242f9f3c40
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency log