All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
Status: retired Python gRPC slice. The "Local provider engine" entry below, the one that describes gRPC on
~/.abx/engine.sock, is the earlier Python slice. The current design is the Node engine: HTTP, SSE and WebSocket, protocolabx-engine/1. See cli/docs/en/reference/engine-api.md. That entry is kept as history.
- Express AK/SK managed-key preparation with explicit consent, private shared storage, expiry renewal and feature-scoped RAM permission guidance. / 极速版支持经确认的 AK/SK 管理 Key 准备、私有共享存储、到期续期及按功能划分的 RAM 授权指南。
- Add canonical application authentication vectors for the Python, CLI and Node clients; SDK runtime/configuration APIs remain unchanged.
-
Reorganize the English and Chinese repository READMEs around installation, first use and task-oriented documentation; keep migration and detailed reference material in their guides.
-
Remove an uncalled private configuration alias helper while preserving public configuration schema exports and compatibility signatures.
-
Normalize Python MCP background-task
sandbox_idhandles to the actualprovider:id. Return the opaque handle unchanged when querying/cancelling; callers parsing a raw ID must update. Legacy raw IDs still resolve within a unique lifecycle cache or the SDK's default-provider scope. / Python MCP 后台任务的sandbox_id句柄规范为实际provider:id;查询和取消须原样回传,拆分原始 ID 的调用者需要更新。历史原始 ID 仍可在无歧义的生命周期缓存或 SDK 默认提供方范围内解析。 -
Add an optional real desktop acceptance runner with isolated pinned dependencies, private ingress, screenshot/input, user handover and replay documentation. / 新增可选真实桌面验收运行器、隔离固定依赖及私有入口、画面输入、用户接管和回放说明。
-
Add opt-in standard-client acceptance for owned OSS persistence across sandbox recreation and read-only enforcement; keep Snapshot mutation inside an owned non-sticky directory and preserve real mounted pause/resume evidence. / 新增标准客户端自有 OSS 跨沙箱重建持久化及只读约束验收;快照修改使用自有非 sticky 目录,并保留真实挂载暂停恢复证据;仅新增验收夹具。
-
Correct bilingual environment guidance for ProviderSandbox ownership, Express terminal-only env flags and authenticated application environment calls; retain provider-specific interpreter and exec initialization contracts. Documentation only, without runtime or version changes. / 修正双语环境说明,明确 ProviderSandbox 资源归属、Express 终端环境参数和带认证的应用环境调用,保留提供方解释器与 exec 初始化契约;仅改文档,不改运行行为或版本。
-
Clarify CLI-started application connection versus Python-owned prepared-reference startup in both template guides; correct the SDK Skill's specification number to 5. No runtime, API or package version change. / 双语模板指南区分 CLI 启动后连接与 Python 根据已准备引用启动,避免重复启动同一个服务;SDK 技能的规范编号更正为 5,不改运行行为、接口或版本。
-
Select verified public client/server a6 in maintained bilingual installs, Skills and runtime fixtures. Preserve immutable publication hashes, exhaustive help checks and real current-design cleanup separately from earlier a4/a5 receipts. No runtime/API change or new package publication. / 维护中的双语安装、技能与运行夹具统一使用已验证公开 a6;另存不可变产物摘要、完整帮助检查与真实设计示例清理结果,不改旧 a4/a5 证据,不改运行接口或另发包。
-
Reuse a persistent loop for synchronous ProviderSandbox calls, preserve background shell execution and quoted arguments, release borrowed decorator clients, and retain session records when deletion fails. Authentication and transport failures now propagate from is_running. / 同步 ProviderSandbox 调用复用事件循环,修复后台 shell 和引号参数,释放装饰器借用连接;删除失败保留会话记录,is_running 向调用方抛出认证和传输错误。
-
Verify explicit Python MCP CPU/memory requests against actual platform metadata before success; reject unknown/mismatched resources, roll back only the new sandbox and report independently verified cleanup or a recovery handle. Direct SDK creation is unchanged. / Python MCP 对显式 CPU/内存请求独立核验平台实际配置,无法核验或不匹配时仅回滚新建沙箱,返回清理确认或恢复句柄;直接 SDK 创建行为不变。
-
Track Python MCP sandbox creation ownership separately from borrowed connections. Closing a borrowing session now closes its client handle without deleting another session's sandbox; explicit kills and retained-task behavior remain supported. Correct the Provider Skill to use
template.prepareinstead of the CLI-rejectedtemplates.deployfeature. / Python MCP 分开记录沙箱创建归属与借用连接;关闭借用会话不再删除其他会话的沙箱,保留显式删除及后台任务保留行为;Provider 技能改用template.prepare,删除 CLI 拒绝的templates.deploy特性声明。 -
Correct current bilingual API/lifecycle examples to use actual base commands/files, canonical Provider parameters and typed timeout cleanup; remove unimplemented global cleanup and speculative persistence/billing guarantees. / 修正当前双语 API/生命周期示例,使用真实 base 命令/文件、规范 Provider 参数与类型化超时清理;删除未实现全局策略及推测的持久化/计费承诺。
-
Correct four remaining public Sandbox class-help imports, preserving the distinct standard and interpreter entries. Audit all shipped Python docstrings and maintained Markdown/Skills; retain explicit third-party and migration examples. Prepare lockstep client/server 0.4.0a6 without runtime/API changes. / 修正四处剩余沙箱类帮助导入,区分标准入口与解释器入口;全量审查源码文档及维护中的 Markdown/技能,保留明确的第三方与迁移示例;准备同版本双包 0.4.0a6,运行行为与 API 不变。
- Correct 24 maintained Template help imports to use existing public
agent_sandboxexports, without changing standard API parameters, runtime behavior or upstream attribution. Prepare lockstep client/server 0.4.0a5; preserve subsequent public-a4 cloud/local example acceptance separately. / 修正 24 处模板帮助示例导入,使用现有agent_sandbox公开名称,不改标准参数、运行行为或上游归属;准备同版本双包 0.4.0a5,另存公开 a4 的后续云端和本地示例证据。
-
Synchronize maintained installs, skills and runtime fixtures with verified public client/server a4. Give only public-metadata 404 propagation an 18-probe bound; retain hard digest/auth/import failures and the original a4 failure/recovery receipts. / 维护中的安装、技能与夹具同步已验证公开 a4;仅将公开元数据 404 传播等待扩为 18 次,保留摘要、认证和导入的硬失败及原始 a4 发布失败/恢复记录。
-
Align ProviderSandbox lifecycle parameter docstrings and copied synchronous docs with their actual canonical signatures; remove nonexistent alias/domain entries without changing runtime behavior. Prepare lockstep client/server 0.4.0a4. / 对齐 ProviderSandbox 生命周期及同步版本文档与真实规范参数,删除不存在的别名和域名参数说明;运行行为不变,准备同版本双包 0.4.0a4。
-
Wait for prepared-template readiness inside one bounded
readiness_timeoutinstead of failing after the first early nonzero probe; preserve timeout/cancellation cleanup. Prepare lockstep client/server 0.4.0a3 without changing published a2 artifacts. / 修复模板进程启动后首次就绪探测过早失败的问题,在单一预算内等待就绪,并保留超时和取消时的资源清理;准备同版本双包 0.4.0a3,不覆盖公开 a2。 -
Build both SDK offline fixtures from the exact public a2 server on official PyPI, remove unreachable local-wheel fallback, and verify actual guest HTTP behavior and cleanup in CI. / SDK 两个离线夹具统一从官方 PyPI 安装精确 a2 服务端,删除不可达的本地 wheel 回退,并通过 CI 验证真实镜像 HTTP 行为及清理。
-
Use the installed public provider API in the creation benchmark, clean each owned sandbox before continuing, propagate cleanup failures, and remove unsupported performance targets. / 创建基准改用已安装公开 Provider API,逐轮清理自有沙箱,透传清理错误并删除无依据性能目标。
-
Align maintained bilingual SDK guides with public 0.4.0a2, canonical decorator/MCP arguments, current ProviderSandbox imports and unified template launch. Remove stale source-install recipes and retired Python-engine instructions. / 将维护中的双语 SDK 指南统一为公开 0.4.0a2、规范装饰器/MCP 参数、ProviderSandbox 公开导入及统一模板启动;删除旧源码安装方案和已退役 Python 引擎说明。
-
Bound public PyPI metadata and fresh-install propagation retries while keeping artifact digest mismatches and dependency/import failures fatal. / 为公开 PyPI 元数据及全新安装增加有限传播重试,保持产物哈希、依赖与导入检查失败即中止。
-
Enforce the documented total command timeout even while stdout/stderr continues; close the stream and attempt to stop the owned PID on expiry (#113).
-
Use current SDK keywords, public installations, HTTP file routes and explicit agent adapters/workspaces in examples; propagate failures instead of reporting successful exits. Remove obsolete installation fallbacks and simulated models.
-
Simplify the Node HTTP and cloud capability examples; verify actual data results and browser artifacts. Correct the E2B provider verifier credential name.
- Prepare paired client/server 0.4.0a2 with synchronized current example guides.
Published alpha pair: v0.4.0a1. Both distributions use the same version; see publication verification.
- Specification 5 starts complete templates without workflow selection. Python now
exposes
launch_template,TemplateSessionandTemplateLaunchError, preserving all declared services and cleanup ownership. Source preparation remains CLI-owned. - Express Provider startup metadata now includes its implemented process-start path, verified with a real two-service template.
- Migrate specification 4 by removing workflow declarations and using the existing
startup/readiness fields.
launch_workflowandworkflow_idare removed; historical receipts remain unchanged and do not certify the new launch path.
- Correct current SDK examples, reconnect semantics, packaged skills and installation guidance; index accepted release/workflow records without rewriting historical verification. / 修正当前 SDK 示例、重连语义、配套技能与安装说明,索引已交付发布和工作流记录,保留历史验证。
-
Align maintained installation, both coding-agent skills and offline fixture images with the verified public 0.4.0a3 pair and official PyPI index; preserve earlier receipts. / 将当前安装文档、两个编码智能体技能和离线夹具镜像同步为已验证公开的 0.4.0a3 双包与官方 PyPI 源,保留历史收据。
-
Simplify the bilingual Provider guide to actual entry points, correct installation verification guarantees and link complete authoring manifests. / 将中英文 Provider 指南收敛到实际调用入口,修正安装验证承诺,并引用完整的编写示例。
-
Record the public 0.3.1a5 pair, artifact digests, clean installation and preserved propagation failure; link the current installation decision and proxy runtime evidence. / 记录公开的 0.3.1a5 配套双包、产物摘要、新环境安装及保留的索引传播失败,补齐安装决策和代理运行验证索引。
- Native
ProviderSandbox.commands.run/start/stream(user=...)now selects the requested envd OS account per request, preserving gateway credentials and concurrent/default identities. Prepare the matching client/server 0.3.1a2 alpha pair; publication is separate. / 原生进程调用按请求选择指定操作系统账号,保留网关凭据以及并发、默认身份;准备配套 0.3.1a2 alpha 双包,发布独立执行。 - Clarify provider-native application clients, published alpha installation, separate gateway/application credentials, and explicit readiness checks after cloud-steps submission in bilingual guides.
- Correct package README installation commands and simplify bilingual installation guides. Both distributions include the application proxy fix from the a4 source candidate; its PyPI upload was stopped before publication to correct stale package metadata. / 修正随包发布的安装说明,简化中英文安装指南。双包包含 a4 源码候选的应用代理修复;a4 在上传前停止,以修正陈旧的包说明。
- Preserve application authentication through proxies that strip Authorization by also using the server's existing X-Access-Token header when it is unoccupied. Keep Bearer compatibility, gateway credentials and injected HTTP client headers unchanged. / 通过未被占用的既有 X-Access-Token 请求头传递应用令牌,兼容会过滤 Authorization 的代理;保留 Bearer 兼容性,不覆盖网关凭据或注入 HTTP 客户端的默认请求头。
- Accept and validate the CLI adapter's optional official source-placeholder metadata without granting Python build operations. Compare SDK prerelease requirements correctly (
a2is older thana3) using the existing packaging dependency. / 校验 CLI 适配器的可选官方源码占位符元数据,不因此授予 Python 构建能力;使用已有 packaging 依赖准确比较 SDK 预发行版本。 - Allow provider-bound managed workflows to use native template IDs without requiring invented immutable versions; preserve operation checks and owned cleanup. Simplify bilingual workflow usage guidance. / 托管工作流可直接使用所属平台的原生模板 ID,不再强制要求不可变版本;保留操作检查与自有资源清理,并简化中英文使用说明。
- Prepare an opt-in PyPI alpha pair, connect publication to the repository PYPI_API_TOKEN secret, and preserve same-tag CI, artifact verification and public readback. / 准备需显式选择的 PyPI alpha 双包,通过仓库 PYPI_API_TOKEN secret 发布,并保留同标签 CI、产物校验及公开回装门禁。
- Provider catalog updates compare content rather than display versions, preserve recorded sources, and recheck SDK compatibility on load.
- Node provider doctor awaits real engine initialization and refuses unverifiable old engines; it never creates a cloud sandbox.
- Add a strict standalone Python-to-Node CI job and bind Python publication to matching tags, tested wheel pairs, and public artifact digests.
- Correct provider trust/consumer guidance and use matching public Git archives in SDK Skills and standalone Dockerfile examples.
-
Preserve native integer or opaque process IDs across engine startup acknowledgments so prepared-image application servers can start through EPP providers. / 引擎启动确认保留原生整数或不透明进程标识,使 EPP 提供方能够启动已准备镜像中的应用服务。
-
Replace current template capability defaults with strict specification 4 workflows and operation contract 1, canonical cross-language plans, identities and verification profiles. / 当前模板改用严格规范 4 工作流及操作契约 1,新增共享规划、身份与验收范围。
-
Provider interpreter execution separates stateless, persistent default, explicit contexts and realtime callbacks; interpreter 404 no longer falls back to shell. / 解释器分别检查无状态、默认持久上下文、独立上下文与实时回调,404 不再自动转 shell。
-
Application HTTP resolves independently of provider transport, preserving proxy/query bindings and isolating credentials; new workflow launch journals ownership and refuses unchecked payloads. / 应用 HTTP 独立解析入口,保留代理与 query 并隔离凭据;新增工作流启动的资源意图记录和调用前检查。
- Include the workflow YAML parser in base client installs and remove the empty declarative extra; verify clean base wheel installation. / 基础客户端直接包含工作流 YAML 解析器,删除空的 declarative extra,并验证纯基础安装。
- Align contributor guidance and English/Chinese API, configuration and provider documentation with the removed project compatibility surface. / 同步贡献指南及中英文 API、配置和 Provider 文档,清除已删除项目兼容接口的旧说明。
- Pre-release project compatibility: old template factories/APIs and selector flags, import aliases, migration commands, deprecated method aliases, old server transfer routes, custom AK/SK token exchange and implicit provider URL/port fallbacks.
- Native named-command
list[str]arguments use strict JSONstring_arraymetadata and per-call copies in server and declarative client; scalar conversion stays compatible. / 原生命名命令支持严格 JSON 字符串数组,服务器与声明式客户端按次复制参数及默认值,保留标量转换兼容性。
- Clarify implemented Express pause/resume and Snapshot standard interfaces, allowlist/runtime requirements and safe cleanup. / 明确极速版标准入口已实现暂停恢复与快照,以及白名单、运行时和清理要求。
- Use the verified canonical website and registry links in active English/Chinese guides.
-
Recognize existing dated JSON verification evidence in repository-health references while retaining missing-record detection. / 仓库健康检查识别已有日期化 JSON 验证记录,并保留缺失记录检测。
-
Reject JSON booleans for integer named-command arguments before dispatch in the server and declarative client; retain numeric CLI strings and boolean-typed arguments. / 服务器与声明式客户端在执行前拒绝把 JSON 布尔值当作整数命令参数,保留数字字符串和布尔类型参数。
-
Repair native asynchronous E2E lifecycle/MCP cleanup entries and distinguish uninstalled-provider refusal from installed-provider credential validation. / 修复原生异步 E2E 生命周期和 MCP 清理入口,区分未安装 provider 的本地拒绝与已安装 provider 的凭据校验。
-
Start native SandboxServer processes before reporting readiness; bound startup acknowledgement, drain output without accumulation and release local readers while retaining remote ownership. / 原生 SandboxServer 启动先确认进程,限制等待并释放本地读取连接,保留远程资源所有权。
- Align Alibaba Express standard lifecycle, process, file and interpreter behavior with the pinned E2B contract; use canonical
E2B_*connection settings. - Reserve create positional arguments for templates and natural language for
--promptin the CLI; document migration, source attribution and backend capability limits.
-
Use explicit native ProviderSandbox in Volume/data-plane adoption examples and distinguish native runtime credentials from control-plane AK/SK in agent guides.
-
Reject undeclared native Express PTY before session/context or wire access.
-
Reconcile provider isolation with accepted native transport, explicit-key authentication and retired-module cleanup; preserve canonical compatibility aliases and pure configuration metadata.
- Retire the unsupported builtin automatic-retry claim. Existing retry configuration names/defaults and EPP compatibility values remain accepted; they do not enable builtin HTTP retries or backoff.
-
Retired the experimental Python gRPC engine and grpcio/protobuf hard dependencies after migrating builtin create, process, files and terminal operations to existing native HTTP protocols. Full platform metadata and envd-version framing are retained; Node provider engine contracts remain. See the bilingual builtin data-plane migration guide.
-
Removed the unconfirmed automatic AK/SK-to-sandbox-key RPC exchange and its private signing/parser helpers. Sandbox requests now fail locally without an API Key; official template/ACR AK/SK operations remain. Explicit custom exchange adapters remain and reject empty/structured token returns. This changes AK/SK-only runtime authentication; see the bilingual migration guide.
-
Provider-registered Express pause/resume and Snapshot create/list/restore/delete, shared by CLI and Python engine clients without backend duplication. / Provider 注册的极速版暂停恢复及快照全流程,两端共用实现。
-
Add local generation2 pause/snapshot acceptance with memory/files/clone assertions, owned cleanup and bilingual provisioning guidance.
-
Sandbox.create(volume_mounts={"/mnt/data": "existing-volume-name"})mounts existing Volumes with the built-in provider. Strict validation runs before provider/engine I/O; unsupported providers fail with E8004. The existing gRPC lifecycle forwards the hint and emits the officialvolumeMounts: [{name, path}]creation payload; empty maps preserve prior requests. Real OSS storage mount/read/write/cleanup is verified for the tested base template in cn-hangzhou. -
agent_sandbox.providers.commands.list_commands,get_commandandrun_commandcall the shared Node engine for provider-specific resource operations. Writes and deletes require explicit confirmation; command POST requests are never replayed. -
Plugin manifests validate bounded
provider-commands/1descriptors and include commands in installation/update consent; existing manifests and receipts default to an empty command list. -
Provider manifests accept the independent
templates.deployfeature for CLI image deployment metadata. Legacytemplates.builddeclarations remain valid; the built-in Express provider does not acquire the new feature. No Python deployment API is added. -
Python MCP bounded binary
upload_file/download_file(1 MiB, strict Base64, SHA256) over both transports; SDKfiles.read_bytes(max_bytes=...)optionally limits streamed downloads and raisesFileSizeLimitError(E4003), while its existing default remains unchanged. -
Python MCP
start_task,get_task, andcancel_taskprovide sandbox-lifetime background handles, bounded saved log pages, explicit disconnect retention and owned process-group cancellation. Normal synchronous cleanup remains unchanged; Python-only, Linux/python3 runtime. -
Python MCP lifecycle tools
list_sandboxes,get_sandbox, andset_sandbox_timeout; creation accepts provider, region, CPU and memory options. Metadata uses a fixed allowlist, external inspection/renewal does not adopt resources, and lifecycle failures omit credential-bearing exception details. -
Add the Chinese counterpart of the historical OpenSandbox provider research archive, preserving its versioned evidence and current-adapter boundary.
-
Route bundled and external backends through the same Provider factory and session hooks. Move Express authentication, native engine/session assembly and reusable E2B adapters into provider modules; preserve public imports and module identity.
-
Keep Express endpoint/region defaults out of external-provider configuration. Clean up newly created resources when session binding fails without deleting borrowed sandboxes.
-
Document mount-capable template selection, the custom MicroVM ossfs2 minimum version, and verified real OSS Volume acceptance with complete temporary-resource cleanup. Extend opt-in E2E coverage to destroy/recreate the sandbox and read the persisted file.
-
Clarify the current Volume invitation-access prerequisite in both language guides; an empty list does not prove create or mount access.
-
The built-in provider no longer advertises
ports.domain,storage.mountornetwork.vpcas callable standard sandbox features. Provider resource management uses the separate command contract.
-
Bind explicit native Express selection to its own configuration even when another provider is the default; reject malformed/reserved qualified sandbox namespaces before backend requests.
-
Reject unknown/empty provider-qualified sandbox references before backend requests; declare Express adapter features explicitly instead of inheriting the whole host registry.
-
Keep port addresses, gateway headers and file-transfer URLs in selected provider adapters; reject missing hooks instead of guessing native routes. Resolve Python compatibility imports lazily.
-
Integrate provider isolation with native HTTP creation, API-key-only runtime authentication and lazy schema composition. Preserve no-replay management requests and provider-owned authentication diagnostics; make local HTTP fixtures address and await their actual listener.
-
Keep an explicitly selected Express provider through native engine creation when the ambient default names another backend.
-
Built-in Express provider update reports its SDK-bundled lifecycle and coordinated client/server/Node upgrade guidance instead of a missing-plugin error; document existing-account adoption and explicit API/configuration changes.
-
Use executable paired-source installation recipes before PyPI publication across current SDK/package guides and examples; replace the retired root version CLI with distribution metadata inspection.
-
Keep HTTP and PTY component-test port candidates distinct, preserving explicit PTY settings and preventing intermittent WebSocket CI bind collisions.
-
Verified native builtin Droid background installation, keyless SDK/HTTP runtime and owned cleanup; source-runtime evidence is distinct from template/image/model acceptance.
-
Python Node-provider engine recovery no longer repeats mutations after a lost connection, including SSE before its first event. Unknown outcomes raise
ProviderProtocolError; safe reads and explicit authentication rejection retain bounded recovery. -
Real-cloud E2E acceptance. The server fixture keeps envd credentials separate from the unconfigured template server; provider reports reject missing checks and the CLI scenario resolves
ABX_BINor an installedabxinstead of assuming a sibling checkout. -
MCP timeout typing. Keep the explicit managed-instance guard valid under the CI type checker while preserving shutdown ownership and renewal cleanup.
-
Stacked pull request validation. The complete CI matrix now runs for pull requests targeting feature branches as well as
main; push validation remains limited tomain. -
MCP external metadata/timeout operations dispatch directly through
Sandbox.get_info_by_id/set_timeout_by_id, closing temporary infrastructure infinally; they never call provider connect/resume and cannot wake paused instances through that connect path. Late managed TTL completion after shutdown cannot restore renewal state. -
agent-sandbox-server serve --commands FILEregisters the module before execution, fixing startup failures for dataclasses with postponed annotations. File imports reuse canonical paths, keep different files isolated, and remove incomplete module/import-path state after a failed load. -
Source-checkout installs with uv now resolve
agent-sandbox-serverto the local workspace member instead of failing with a missingtool.uv.sourcesentry. Published dependency pins are unchanged.
Both distributions are 0.3.0. The client on PyPI is agent-sandbox-client (import agent_sandbox). agent-sandbox is an unrelated project, so do not pip install agent-sandbox. The server distribution is agent-sandbox-server. Directories, the repository, and the CLI are unchanged.
This release makes the SDK work on Alibaba Cloud Express generation 2: streaming RPCs use the Connect envelope when envd is 0.6 or newer, and Sandbox.info.envd_version is kept. Port 9000 does not send the sandbox access token to an unconfigured agent-sandbox-server. Named commands return the command value; unknown names, bad arguments, and command exceptions are typed errors. Sandbox.create_sync and connect_sync keep the class, including a subclass. The template-author quick path is in the SDK usage guide.
-
Resolve provider configuration through a lazy composition-root adapter rather than an upward transport-to-registry import; preserve schema imports, provider resolution and lazy package initialization.
-
The client PyPI distribution is
agent-sandbox-client.agent-sandboxon PyPI is an unrelated project (Agent Infra Team). Importagent_sandbox, the repository, the CLI, andagent-sandbox-serverare unchanged. Do not runpip install agent-sandbox. -
Catalog providers run on the Node.js host.
opensandbox,e2b,cubesandboxandalicloud-containerare allnodeplugins (OpenSandbox runs its EPP/1 methods in the host process, andnode provider.mjsstill serves EPP/1 on stdio); thepythonplugin kind is gone (aProvidersubclass in code still works). The SDK reachesnodeplugins through the local engine (abx provider engine serve, started on demand;abxmust be onPATHor inABX_BIN).EngineProviderandEngineClientare new inagent_sandbox.providers;e2b_shapeis removed. Anexecplugin (third-party, any language) can now host a terminal (pty.open/write/resize/close,pty.output,pty.exit). -
The Python project is split into two lock-step PyPI distributions in one repository (
python-sdk).client-sdk/is theagent-sandbox-clientdistribution (importagent_sandbox: transport, protocol, models, API, declarative@sandbox, MCP server, E2B migration helper).server-sdk/is the newagent-sandbox-serverdistribution (importagent_sandbox.server): the container-side runtime that used to ship insideagent-sandbox. Both share theagent_sandboxnamespace (the server distribution ships onlyagent_sandbox/server/and has noagent_sandbox/__init__.py), each has its ownpyproject.toml, tests, README,py.typedmarker and_version.py, and both are released with the same version number (publish.ymlpublishesagent-sandbox-serverfirst, thenagent-sandbox-client). Migration: install the in-container runtime withpip install agent-sandbox-server(template Dockerfiles, e.g.examples/templates/python-hello).agent-sandbox-clienthard-depends onagent-sandbox-server==<same version>, sopip install agent-sandbox-clientstill providesagent_sandbox.server; the[server]extra remains as an empty alias.from agent_sandbox.server import ...is unchanged. A server-only install has noagent_sandbox.__version__; useagent_sandbox.server.__version__. -
Missing or broken
agent-sandbox-servernow raises an actionableImportErrorfrom the@sandboxdecorator'ssandbox.serverproxy, namingpip install agent-sandbox-serverand the--force-reinstall --no-depsrepair. -
Project URLs point at the renamed repositories (
agent-sandbox/python-sdk,agent-sandbox/agent-sandbox). -
Repository plumbing follows the split.
Makefiletargets (install,dev,test,lint,format,format-check,typecheck,build,dist-check,ci,clean,hooks) operate on both packages; CI runs ruff,ruff format --check, mypy and pytest per package on Python 3.10/3.11/3.12, builds both distributions, runstwine check, verifiespy.typedin both wheels and that client + server install into one virtualenv and import; Dependabot watches/client-sdkand/server-sdk. The packaging test (test_packaging.py) is ported to both packages (client wheel has noagent_sandbox/server, server wheel has noagent_sandbox/__init__.py). -
Open-source hygiene. Scripts, examples and docs no longer contain developer-machine paths, a personal ACR namespace or fixed e2e tags: the e2e scripts require
ACR_NAMESPACE(no personal default), theabxexecutable used byscripts/cloud_e2e_test.pyandexamples/compat-demos/e2e_capability_validation.pyis resolved fromPATH(override withABX_BIN), and.env.exampleuses the<your-namespace>placeholder. New regression guardmake hygiene(scripts/check-no-local-paths.sh, allowlist inscripts/local-paths.allowlist) runs in CI and fails on user-home paths, Windows user paths,.venv/binassumptions, personal identifiers and key-like strings. -
Dotenv resolution is layer first.
./.envand~/.abx/.envused to be merged per exact variable name before name priority was applied, so./.env: SANDBOX_API_KEY=awith~/.abx/.env: E2B_API_KEY=bresolved tobalthough the documentation says the project file wins. The project file now wins (a). This is the only observable change of the new naming scheme; every other combination, including all existing tests, resolves as before.
- Official site and registry website. READMEs and the docs index name https://www.agent-sandbox.com and https://registry.agent-sandbox.com. The installer still fetches
https://registry.agent-sandbox.cn/providers/index.json. - SDK skill.
agent-sandbox-sdk/SKILL.mdtells a coding agent how to write a client and a template (@command/start()underif __name__ == "__main__", FC base image foralicloud-express, generic image otherwise, the built-in provideralicloud-express). The folder name matchesname. The repository-rootSKILL.mdis removed so a copied skill is not a second guide. Guide: sdk-skill. - Local provider engine (historical; superseded for catalog providers — see the status note at the top). SDKs dial gRPC on a Unix socket (
~/.abx/engine.sock). The engine holds backend HTTP, SSE and WebSocket connections.Sandbox.createfor the built-in Alibaba Cloud provider sendsCreatethrough the engine, which performsPOST /sandboxes. Commands, files and the PTY for that sandbox also go through the engine (ExecStart,FileRead,FileWrite,FileOp,WatchDir,Pty); the SDK does not open those sockets itself.Engine.exec_sseandEngine.terminalremain loopback-only compatibility calls. The socket is mode0600. A live socket is reused, not replaced.Healthreports protocolabx.engine.v1. Start a shared process withpython -m agent_sandbox.engine. - Provider authoring skill (
agent-sandbox-provider/SKILL.md). Tells a coding agent how to add arest,exec, orpythonprovider: the 18 feature ids, extensions, and a credential name that is notABX_SANDBOX_API_KEY. - Only
alicloud-expressis built in. OpenSandbox, CubeSandbox, E2B, and the container edition live inawesome-providers/and install withregistry:<id>fromhttps://registry.agent-sandbox.cn/providers/index.json. A background check writes newer versions to~/.abx/providers/updates.json. - E2B and the container edition no longer call routes those APIs do not have. Command start sends
stdin: false. Directory watch readsfilesystem.name/filesystem.type. The container edition lists viaGET /v2/sandboxes, puts/49983on the private envd path, runs code at port 49999, and does not declarepty. E2B connect triesPOST /v2/sandboxes/{id}/connectfirst. - CubeSandbox data plane matches the current Cube SDK. envd URLs are
http://49983-{id}.{domain}, a missingenvdAccessTokenis not an error, process RPCs use a Connect frame,run_codeposts to Jupyter port 49999, andABX_CUBESANDBOX_PROXYdials CubeProxy while keeping the virtual Host. Review: CubeSandbox. - E2B, CubeSandbox, and container-edition defaults match the current upstream SDKs. E2B defaults to
https://api.e2b.appand domaine2b.app. CubeSandbox's domain default iscube.app.connecttriesPOST /sandboxes/{id}/connectbefore GET. Cube process and file calls sendrootwhen the user is omitted, andfiles.watchis declared. Readiness notes: provider-readiness. - Live provider end-to-end tests (
e2e/test_08_providers.py). Each built-in provider is created for real when its backend is up. OpenSandbox on127.0.0.1:8080and Alibaba Cloud Express (SDK and CLI) are executed there. CubeSandbox, E2B, and the container edition skip when their own endpoint or key is absent, and they do not reuse the Express key. - Catalog providers besides Express.
alicloud-container,cubesandbox,e2b, andopensandboxinstall fromawesome-providerswithregistry:<id>. They are not compiled into the SDK.alicloud-containeris the ACS/ACK sandbox-manager.cubesandboxspeaks CubeAPI (defaulthttp://127.0.0.1:3000).e2bspeakshttps://api.e2b.appwithABX_E2B_API_KEY. OpenSandbox talks HTTP from the Node host (provider.mjs: execd SSE, raw file bodies, PTY on the execd WebSocket). None of them readsABX_SANDBOX_API_KEY. After install, the CLI loads these ids (abx --provider <id>). - Fine-grained, per-endpoint capability management in
agent-sandbox-server. In addition to capability groups, every built-in and custom route can now be enabled/disabled individually and constrained by a declarative policy: required permission scopes (files:read,process:run, ...), path scoping (allow/deny globs, read-only roots, symlink modes), size and rate limits, parameter rules (upload overwrite and extensions, command allow/deny lists, code languages, URL allow/deny and private-network blocking, signal and shell allow lists) and audit logging. Configure throughSandboxServer(policy=...),agent-sandbox-server serve --policy FILE --preset NAME,ABX_SERVER_POLICY/ABX_SERVER_POLICY_FILE,/etc/agent-sandbox/server-policy.json, or thetemplate.yamlserver:block (presets:default,transfer-only,read-only,hardened,locked; multiple token identities with scopes). An unconfigured server behaves exactly as before. Error bodies gain a stablecode(path_not_allowed,missing_scope,endpoint_disabled,rate_limited, ...). Design, two review rounds and bypass analysis: fine-grained-capabilities, review log. - Server discovery v2.
GET /capabilitiesaddsapi_version,server_version,identity,policyand a per-endpoint table (groupsunchanged);POST /capabilities/checkreturns the policy decision for a hypothetical call without touching the filesystem. - New server endpoints to match the client:
GET /files/watch(SSE),POST /process/{pid}/stdin,GET /process/{pid}/output,GET /pty/sessions/{id},POST /pty/sessions/{id}/resize; additivecwd/env/timeoutfor/shell*andenv/capture_output/stdinfor/process/start. agent-sandbox-serverconsole command (serve,healthcheck,check-config,version; alsopython -m agent_sandbox.server) for container start/ready commands and policy validation.ServerClientandSandbox.server/Sandbox.server_at()/Sandbox.start_server(). A typed async client (with*_synctwins and SSE/WebSocket streaming) for every SandboxServer route, explicit capability discovery (discover()->ServerCapabilities, fail-fast pre-checks), and typed errorsServerAPIError(E9000),ServerAuthError,PolicyDeniedError,FilePolicyDeniedError,EndpointNotAvailableError,PayloadTooLargeError,RateLimitedError(E9001-E9005; see error codes). Alignment matrix: client-server-alignment.- Template
server:block.SandboxTemplate.servercarries the declarative server policy block. Official base image and Dockerfile lint are the CLI's job (abx template build); see base-image-and-server-sdk. - Canonical names for every credential and configuration key, with a complete alias table (
agent_sandbox.utils.config_keys,agent_sandbox.transport.config). Environment variables areABX_<KEY>(core) andABX_<PROVIDER>_<KEY>(provider scoped), for exampleABX_SANDBOX_API_KEY,ABX_SANDBOX_BASE_URL,ABX_SANDBOX_DOMAIN,ABX_ALICLOUD_EXPRESS_REGION,ABX_ALICLOUD_EXPRESS_ACCESS_KEY_ID,ABX_ALICLOUD_EXPRESS_ACR_NAMESPACE,ABX_GITHUB_TOKEN,ABX_HTTP_TIMEOUT,ABX_LOG_LEVEL.TransportConfigfields andSandbox.create/connectkeyword arguments gainsandbox_api_key,sandbox_base_url,sandbox_domain. The product reads only these names. Vendor names that the vendor publishes (ALICLOUD_*,ACR_*,GITHUB_TOKEN,OPENAI_*,DASHSCOPE_API_KEY) keep their own names.E2B_*andSANDBOX_*environment variables are not read. See Configuration. - Audit and migration helpers:
audit_config()lists the legacy names in use (names only, never values);explain_config()reports which layer and name decided each key (secrets masked);plan_migration()/apply_migration()rewrite stored names to the canonical ones (backups*.bak, mode 600). Opt in to aDeprecationWarningper legacy keyword withABX_WARN_DEPRECATED=1. - Provider plugins (
agent_sandbox.providers). The built-in backend is now presented as Alibaba Cloud Express Edition (阿里云极速版), idalicloud-express, and stays the default. Third-party providers install from a directory or git URL withpython -m agent_sandbox.providers install|list|info|update|uninstall|default|doctor(the same layout, receipts and tree digest theabx providercommands use) and are selected withSandbox.create(provider=..., provider_options=...),ABX_PROVIDER,./.env,~/.abx/.envor[core] providerinconfig.toml. Plugins arerest(declarative E2B-protocol manifest),exec(EPP/1, JSON-RPC 2.0 over stdio, language neutral) orpython(register_provider()/ entry-point groupagent_sandbox.providers). Install executes nothing from the plugin, pins by commit or digest, verifies the digest on every start, scrubs the process environment, and gives generic credentials (sandbox_api_key,sandbox_base_url,sandbox_domain) to a plugin only through a manifest[core] inheritthe user consented to. 18 capability features; unsupported ones raiseProviderFeatureNotSupportedError. A reusable contract-test kit is inagent_sandbox.providers.testing, and reference plugins are inexamples/providers/. See Providers and the design. - Provider plugin follow-ups.
python -m agent_sandbox.providers test <id>runs the contract kit (now 18 tests: exec stream, files, timeouts, kill idempotence, E8004, secret redaction) against an installed provider;updategains--allow-insecure-transportand--no-verify;epp-methods.jsonis a machine-readable EPP/1 method table (params, result, support level) mirrored byte-identically to the CLI fixtures;Sandbox.create(provider_options=...)is also forwarded to the plugin as per-createoptions(secret fields removed);secureis optional (Nonekeeps the previous behaviour, plugins receive it only when set);Sandbox.network.resolve()/resolve_url()use the provider'sports.url;execadapters fall back fromsandbox.connecttosandbox.getwhen the plugin lacksconnect;ProcessInfo.pidandCommandsacceptint | str(EPPprocess_idis a string). - Provider error codes E8000-E8030 (
ProviderErrorand subclasses, includingProviderResourceNotFoundErrorE8005 andProviderFeatureNotSupportedErrorE8004, which is also aCapabilityNotSupportedError). Sandbox.providerproperty andSandbox.close()/close_sync()(release provider resources such as a plugin process).LocalSessionStoresessions record their provider.ABX_LOG_LEVELis the canonical name ofSANDBOX_LOG_LEVEL.- Language-neutral conformance fixtures (
client-sdk/tests/fixtures/*.json) shared with the Node CLI: key registry, resolution vectors, tree-digest vectors, EPP error mapping, migration vectors. - Real-cloud E2E suite and the Definition of Done.
make e2erunse2e/(pytest, markere2e) against the real platform: lifecycle, commands, files, processes, ports, timeouts, the declarative@sandboxdecorator andagent-sandbox-serverinside a real sandbox;make e2e-alladds slow tests. Tests skip with an explicit reason without credentials and are never collected by the unit CI. Every sandbox and template is tagged and removed in finalizers;make e2e-cleanup(scripts/e2e-cleanup.py) is the janitor. Defects found are pinned as strict xfails and listed ine2e/KNOWN-ISSUES.md(KI-001 to KI-011). New rules in.agents/notes/DEFINITION-OF-DONE.md(English and Chinese, with ADR and evidence templates), linked fromCONTRIBUTING.mdand the PR template. Guide: Testing & Definition of Done (中文).
-
Sync factories keep the class.
Sandbox.create_sync,connect_sync,list_sync, andkill_by_id_syncare classmethods. They pass the class through, including a subclass, instead of binding the first argument tocls(TypeError: Sandbox.connect() missing 1 required positional argument: 'sandbox_id'). -
Alias capability lookup.
Sandbox.create/connecttry the caller's template string, then the platform template id (info.template) andinfo.alias_name, and use the first~/.abx/templates/**/template.yamlthat matches. A unique alias with no local file stays at debug and uses the default capabilities. The platformGET /templates/{id}payload has no capabilities field, so a cache miss cannot be filled from the API. The longerno matching template.yaml in ~/.abx/templateswarning is emitted by theabxCLI, not this package. -
Express template author path.
Sandbox.createthrough the local engine copiesenvdVersionontoSandbox.info.envd_version(generation 1 is0.5.2, generation 2 is0.6.1). A remote template id no longer logs a warning when no localtemplate.yamlexists; capabilities still fall back to the defaults.sandbox.run(name, **kwargs)returns the command value. An unknown name isCommandNotFoundErrorand includes the server's available-command list. Bad arguments areCommandArgumentError(HTTP 400). A command that raises isCommandExecutionError(HTTP 500), which is also aServerAPIError.timeout=onsandbox.runis the HTTP timeout and is not sent as a command argument. Named commands do not stream stdout; a shell command usessandbox.commands.run(..., on_stdout=). -
Express generation-2 envd streaming.
commands.run/filesgo through the local engine to envd. Generation-2 envd (v0.6+, Express--generation 2) requires the 5-byte Connect envelope on streaming RPCs such asprocess.Process/Start. The client was sending raw JSON, which envd reported asinvalid_argument: protocol error: promised N bytes in enveloped message. Streaming calls are enveloped. Unary RPCs stay raw JSON and useContent-Type: application/json(generation-2 envd returns HTTP 415 forapplication/connect+jsononfilesystem.Filesystem/ListDir). Generation-1 envd (v0.5.x) still receives raw JSON on streams andapplication/connect+jsonon unary calls. A Connect error trailer, or a raw JSON error body, is raised asEnvdRpcErrorcarrying the envd code and message. That error survives the engine gRPC boundary instead of becomingRuntimeErrorwith an empty message.commands.runacceptson_stdoutandon_stderr. -
Express port 9000.
Sandbox.server,server_at(), andsandbox.run()do not send the sandbox access token. On the current Express image an unconfiguredagent-sandbox-serveranswers HTTP 401 whenX-Access-TokenorAuthorizationis present, because it treats any presented credential as a login.network.get_access_headers()staysX-Access-Tokenonly, for the platform gateway (envd/filesand a manualGET /health). A server with noABX_SERVER_TOKENnow keeps a presented but unmatched credential anonymous, so a later image tolerates a forwarded gateway token. A server that setsABX_SERVER_TOKENstill requires that token (server_at(token=...)). -
Provider installer and contract kit. A failed
updateno longer loses the plugin'sdata/directory (rollback restores it exactly);python -m agent_sandbox.providers updateaccepts--allow-insecure-transportlikeinstall; the documented contract-test invocation no longer collects 0 tests; the streaming exec adapter raisesCommandTimeoutErrorinstead of a bareasyncio.TimeoutError. -
agent-sandbox-server: HTTP and archive hardening that applies to every server, configured or not. A non-numeric, negative, signed or conflictingContent-Lengthis now answered with400instead of crashing the request thread, andPOST /files/archive(zip) no longer follows a file symlink that points outside the base directory (previously the target's content was archived). -
agent-sandbox mcp(STDIO): apingsent right behind the firsttools/callcould wait hundreds of milliseconds. The first tool call imported the SDK's sandbox layer lazily (about 300 modules, CPU-bound) on the event loop, which stalled every other request; the server now imports it at startup.Commands.send_signaland the API reference / SDK usage guide (en, zh) now state that only SIGTERM (15) and SIGKILL (9) are delivered and any other number raisesValueError. -
SDK defects found by the real-cloud E2E suite (present since 0.2.0; ids from
e2e/KNOWN-ISSUES.md, each pinned by regression tests inclient-sdk/tests/test_known_issues/and by the now ordinary tests ine2e/):- KI-001
commands.run/start/stream(env=...)sent the variables asprocess.envVars; envd'sProcessConfigfield isenvs, so per-call environment variables were silently dropped. They now reach the command (sandbox-createenvVarsis unchanged). - KI-002
files.list/files.get_infonow understand envd'sEntryInfo: the numerictype(2= directory;FILE_TYPE_DIRECTORYand a stringsizeare accepted too) and theentryobject ofStat. Directories were reported asfileandget_inforeturned a blank name/path. - KI-003 a command that outlives its timeout now raises
CommandTimeoutError(E3001) instead of a rawhttpx.ReadTimeout; the process is also killed on a best-effort basis (closing the HTTP stream did not stop it). A connect timeout is aConnectionError_. The timeout is still an inactivity limit (no output fortimeout + 5s), not a wall-clock deadline. - KI-004
commands.kill,send_signal,send_input(andProcessProtocol.connect_to_process/update) posted a flat{"pid": N, ...}body that envd ignores. They now send{"process": {"pid": N}, "signal": "SIGNAL_SIGTERM"|"SIGNAL_SIGKILL"}and{"process": {"pid": N}, "input": {"stdin": <base64>}}; a non-numeric string pid is sent as a processtag. envd can only deliver SIGTERM (15) and SIGKILL (9): any other signal number raisesValueErrorinstead of being silently lost. HTTP errors of these calls areEnvdRpcError(for exampleprocess not found). - KI-005 not-found conditions no longer leak
httpx.HTTPStatusError:Sandbox.connect()/get_info()/set_timeout()/pause()/resume()of an unknown sandbox raise the newSandboxNotFoundError(E2009, error codes;killstays idempotent), and every envd file operation maps HTTP 404 toFileNotFoundError_, 403 toPermissionDeniedErrorand any other status toFileOperationError. - KI-006 a Platform API 401 raises
InvalidAPIKeyError(InvalidCredentialsErrorwith AK/SK), bothAuthenticationError, instead of a rawhttpx.HTTPStatusError; the message never contains the key or the URL.Sandbox.createwith a bad key is therefore anAuthenticationError, not aSandboxCreationError. - KI-007
files.listof a missing directory raisesFileNotFoundError_instead of returning[](envd answersListDirwith HTTP 200 and no entries; an empty answer is now disambiguated with oneStat). - KI-010
@sandboxon anasync deffunction returned the string<coroutine object ...>; the generated remote script now awaits it (asyncio.run). - Not SDK defects (behaviour unchanged, reported clearly): KI-008 an envd upload/download that outlives the HTTP timeout is now a
FileOperationErrornaming the path, the size andABX_HTTP_TIMEOUTinstead of a barehttpxtimeout; KI-009 (Jupyter service answers 404:run_codealready logs the fallback to a shell) and KI-011 (ACR push bandwidth: the E2E canary skips with the reason) need no SDK change.
- KI-001
- The
abxCLI moved out of the Python package to a Node.js/TypeScript project (@agent-sandbox/cli, theclirepository). Gone fromagent-sandbox: theagent_sandbox.clipackage, the[cli]and[binary]extras, theabxconsole script, the PyInstaller standalone-binary build (scripts/build_binary.py) and the release-binary workflow, together with the CLI documentation (CLI design / tutorial / reference, binary installation, using templates, deploy & build, e2e template workflow, templates catalog, agent-skill installation) andSKILL.md, which now live in theclirepository. The CLI behaviour, flags, output and configuration files (~/.abx/...) are unchanged by the move. Migration: replacepip install "agent-sandbox-client[cli]"withnpm install -g @agent-sandbox/cli;pip install "agent-sandbox-client[cli,alicloud]"becomesnpm install -g @agent-sandbox/cli(the CLI carries its own Alibaba Cloud template client). - The coding-agent modules of
agent_sandbox.agentmoved to the CLI:adopt,clarify,codegen,coding_agent,qwen_code,template_guideanddockerfile_sources(used only byabx create "DESCRIPTION",abx template initandabx template init --adopt).agent_sandbox.agent.{tools,mcp,mcp_http}stay in the SDK;python -m agent_sandbox.agent.mcpstill starts the MCP stdio server. - The client is a runtime SDK; template build and deploy belong to the CLI. Removed from
agent-sandbox:Sandbox.deploy,DockerBuilder,Image,FCTemplate*,agent_sandbox.api.{deploy,docker_builder,fc_template,image,base_image,template},agent_sandbox.protocol.template,agent_sandbox.utils.dockerignore, the[alicloud]extra, the modelsBuildInfo,BuildStatus,TemplateInfo, and the E7xxx (deploy/build/docker/ACR) error codes. Migration:abx template build|deploy(see Build & Deploy). - One way to call a named command:
sandbox.run(name, **kwargs).Sandbox.custom(),Sandbox.run_command(),CommandResult,CustomCommand,CustomCommandArgand thetemplate.yamlkeycustom_commands(including{placeholder}substitution) are gone; atemplate.yamlthat still hascustom_commandsfails validation.sandbox.run("name", **kwargs)isPOST /commands/nameon the in-sandbox server (CommandNotFoundErrorwhen unknown;list_commands()lists them). Bare shell stayssandbox.commands.run(cmd).@sandbox.registerno longer takesimage=. - One way to run an agent in a sandbox: the Agents API (
/v1/agents/**).BUILTIN_AGENTS,agent_sandbox.agent.builtin,agent_sandbox.agent.inferand the design docsbuilt-in-agents.mdandagents-api-cli-followups.mdare removed. The CLI has noabx agentcommand. - One capability switch, and the client follows it. Groups are aliases for endpoint ids;
ABX_SERVER_ENABLED_GROUPSis the only group variable (it only turns groups on) andABX_SERVER_DISABLED_GROUPS,enable_builtinanddisable_builtinare gone (useenable_group()orserver.groups). The/opssurface andserver/core/*are deleted; the server declares oneENDPOINTStable (118 endpoints). In the client,ServerCapabilitieshas no legacy mode and noENDPOINT_GROUPStable; it exposesgroups,group_summaryandrule(endpoint).EndpointInfogainssummaryandrule,ServerAPIErrorgainsrule, a 404 withcode: endpoint_disabledmaps toEndpointNotAvailableError, and path violations are 403path_not_allowed(FilePolicyDeniedError). template.yamlserver.groupsis a list (groups: [file_ops]) or a map (groups: {process: false});validate_server_blockchecks the group names (SERVER_GROUP_NAMES) andcorecannot be turned off.sandbox.register.upload()and.download()are removed. File transfer is thefile_opsgroup (/files/*,/upload,/download);sandbox.registeronly registers named commands.- Examples, templates and e2e use the current server API.
examples/templates/python-helloand everyawesome-templates/*/commands.pyregister with@commandand start withstart();agents-clilimits the server with an endpoint policy instead of a group alias;awesome-templates/CONTRIBUTING.mdno longer mentionscustom_commands. The local e2e (e2e/test_server_http_e2e.py,test_agents_transport_e2e.py,test_client_sdk_local_e2e.py) test endpoint states, rule codes andpath_not_allowedinstead of/ops, andexamples/run_examples_e2e.pyrunsexamples/agents/complete_case.py. agent_sandbox.extensions.{oss,vpc,domain}removed. They were empty shells. The platform exposes no per-sandbox API for them: VPC is a template runtime setting, volumes are created through the control plane, and custom domains are account level.- Env variables:
E2B_API_KEY/SANDBOX_API_KEYin error text and docs now readABX_SANDBOX_API_KEY. Product descriptions no longer claim E2B protocol compatibility or a drop-in replacement. Sandbox.create(description=...)and the natural-language hint are gone. Natural-language creation lives in the CLI (abx create "...",abx template init "..."). The error classesE2005-E2008(AI template generation) are removed with the E7xxx codes; they belong to the CLI.- e2e and scripts follow the runtime-only client.
e2e/test_08_custom_template_docker.py,e2e/e2e_acr.py,scripts/e2e/*(build, push and cloud-flow scripts) are deleted; the pytest suite ine2e/andabx templatecover them. The suite readsABX_SANDBOX_API_KEY;make e2e-allno longer needs Docker or ACR;scripts/e2e-cleanup.pyonly kills tagged sandboxes.docs/*/design/sdk-api-design.mdis rewritten to the current two paradigms;agent_sandbox.compatis documented as a partial migration helper.
-
CLI config uses one name per credential.
abx configlistssandbox_api_keyfor the sandbox service key (still stored asE2B_API_KEY;abx config get/set api_keyremains an alias). NL inference and the coding agent sharellm_api_key,llm_base_url, andllm_model.qwen_code_api_key,qwen_code_base_url, andqwen_code_modelare no longer configurable;config get/config setname thellm_*replacement. An olderABX_QWEN_CODE_API_KEY(and storedqwen_code_base_url/qwen_code_model) is still read when the matchingllm_*value is unset, and shows up under thellm_*name. Migration: useabx config set sandbox_api_key <KEY>andabx config set llm_api_key <KEY>. Setllm_base_url/llm_modelonly when the DashScope default is not the endpoint you want. The Python SDK parameter staysapi_key=. -
abx deployis the fixed build → push → register pipeline. It now runs exactly whatabx template deployruns (docker build, push to ACR,CreateTemplate, wait for ready), withPATHdefaulting to., and shares every option of that command including-v/--verbose,--acr-namespaceand--region. It needs no LLM and no LLM key, takes no description (theINSTRUCTIONargument is gone), and no longer starts aqwen-codecloud sandbox or raisesE7001. What a template is lives intemplate.yaml, authored byabx template init;deployonly reads itsname,resourcesandgeneration.--traditionalis deprecated and ignored (with a warning); the old traditional-mode-only--watchoption is removed, and--aliasnow istemplate deploy's template alias. Migration:abx deploy ./p "instruction"becomesabx template init "DESCRIPTION"(the AI writesDockerfile,commands.py,template.yamlinto./<name>/) followed byabx deploy ./<name>. The in-sandbox agent deploy remains available as the SDK APISandbox.deploy().
- Credentials resolve in one order everywhere. An explicit argument wins, then the process environment, then
./.env, then~/.abx, then a built-in default..envfiles merge per key, so a project file that omits a key no longer hides~/.abx/.env. A blank or whitespace-only value does not count.Sandbox.create,Sandbox.deploy, natural-languageabx create, GitHub template downloads, andabx mcp installfollow that chain.abx mcp installcopiesE2B_API_URLandSANDBOX_REGIONinto the editor config only when the process environment sets them. The table is in the configuration reference.
abx config delete KEY: remove one stored configuration value (a credential,acr_namespace, a connection setting, orshortcuts.<name>). The key falls back to its default or becomes not set.abx config set KEY ""still does the same thing. Environment variables are not unset, and there is still no command that wipes~/.abx.- Long steps keep a moving header. Creating a sandbox, upload, download, template fetch, registering a template from an image, installing the coding-agent CLI, and
abx kill --alluse the samemessage... 12sheader as deploy, redrawn once a second on a terminal. Grey lines are safe text only: relative paths, install milestones, and (for deploy) docker or poll output. File bytes, tool input, ACR tokens, and--build-argvalues are not shown; the docker command logged at info level redacts build-arg values.--json,--quiet, CI,TERM=dumb, and non-TTY stay silent for these headers. Deploy still prints one progress line per phase in those modes, and--verbosestill prints the full deploy log instead of the block. - Build, push, and wait steps show their log. On an interactive terminal,
abx deploy/abx template deploy/abx template pushdraw each long step as amessage... 12sheader with the latest four lines ofdocker build,docker push, or READY-poll output in grey underneath (ABX_ACTIVITY_LINESchanges the count). The elapsed time keeps moving once a second while the tool is silent.--verboseprints the full log instead.--json,--quiet, CI, and non-TTY stay one progress line. While a template is generated, a tool name appears when the call starts, still without tool input. abx init "DESCRIPTION"asks for a directory. Natural-languageabx init/abx template initasks an interactive terminalDirectory for the template projectbefore generating. Enter keeps./<name>/(or./<--name>/). Any other path is the project directory itself.--yes,--json, and non-TTY skip the prompt. A file, or a directory that already has template files, is rejected before generation;--forceoverwrites.abx template init --adopt [DIRECTORY]: turn an existing project into a deployable template. Qwen Code sees a staged copy (secrets, keys and secret-looking files excluded) and onlyDockerfile,commands.py,template.yamland a generated.dockerignoreare written back, after a preview.--hintadds what the code cannot say,--dry-runlists the files that would be sent and contacts no model,--yesskips both confirmations, and--forceis what replaces an existing Dockerfile when there is no interactive preview. Replaced files are kept as*.abx-bak. The agent process does not inherit cloud credentials.abx template init --from <local dir>now refuses a directory that has notemplate.yamland points at--adopt. Nothing is built or deployed; publish withabx deploy.abx create --dir DIRECTORY: choose the parent directory for the AI-generated template files (Dockerfile,template.yaml). Without it, an interactive terminal is asked where to save them (Enter keeps the default~/.abx/generated);--yes,--jsonand non-TTY sessions use the default silently.- Live agent activity line: while Qwen Code researches, assesses or generates, a TTY shows the
Assessing description... 12sheader with the agent's last four activity lines in grey on the lines below it, scrolling line by line as the agent produces text or uses a tool (ABX_ACTIVITY_LINES=1..10changes the count; also works under--verbose). It shows only assistant text lines and tool names, never tool input; it is absent for--json,--quiet, CI andTERM=dumb, and never touches stdout. Research now has its own "Researching public facts" phase. - Configurable CLI shortcuts: Command aliases are now configurable via
[shortcuts]section in~/.abx/config.toml. All existing top-level shortcuts (create, list, info, etc.) are enabled by default. Users can add custom shortcuts withabx config set shortcuts.<name> "<target>". Runabx config initto generate a complete shortcuts template with all available commands. - Natural-language template init:
abx template init "DESCRIPTION"(andabx init "DESCRIPTION") generatesDockerfile,commands.pyandtemplate.yamland stops. Interactiveabx create "DESCRIPTION"/abx sandbox create "DESCRIPTION"first asks whether to switch to that template-only path before building, pushing, deploying, and creating a sandbox.--yeskeeps the full create pipeline. - AI-generated templates ship a server: the natural-language generator now writes
commands.py(anagent_sandbox.serverSandboxServeron port 9000, the process the deployed sandbox answers HTTP with),template.yamlwithcapabilities/ports, and aREADME.mdnext to theDockerfile, instead of a Dockerfile-only image. The prompt carries the server SDK reference (agent/template_guide.py); a result without a validcommands.pythat starts the server is rejected.template init "DESCRIPTION"copies every generated file into./<name>/.
- Remote MCP refuses to start without a Bearer token. The FC artifact calls
require_auth_token, so an emptyABX_MCP_AUTH_TOKENfails the process instead of serving/mcpwith authentication disabled. STDIO still has no Bearer token (the IDE owns the local process). Loopback HTTP may omit the token and warns; any other bind requires one. abx mcp startprints its configuration and can be stopped. A foreground STDIO process writes the transport, template, whether an API key is set, the tool list, and how to stop to stderr, and leaves stdout for JSON-RPC.--httpserves Streamable HTTP;--backgrounddetaches that HTTP server (the API key and token stay in the child environment).abx mcp stopsends SIGTERM to the pid recorded under~/.abx/run.abx mcp statusreportsmcp_running.- MCP sessions follow the documented agent loop.
create_sandboxbecomes the default sandbox, so later tools can omitsandbox_idandkill_sandboxdestroys that sandbox; killing when nothing exists returns an error. An omitted template uses the server template. Lazy creation is single-flight, and each use extends the sandbox timeout.run_commandruns viash -c. A non-zero exit is a tool error. STDIO accepts messages up to 8 MiB and answerspingwhile a tool call is in flight.GET /mcpreturns 405.abx mcp deployrefuses to write an artifact without a non-empty Bearer token and setsSANDBOX_REGION.abx mcp install --target vscodewrites.vscode/mcp.jsonand leaves non-strict JSON alone. abx config initasks for the template-deploy prerequisites. The guided wizard now also prompts for the ACR namespace and the Alibaba Cloud AccessKey ID / Secret (Enter skips any prompt).acr_namespaceis a config key stored in~/.abx/.envasACR_NAMESPACE, soabx installandabx template deploypick it up without--acr-namespace. The missing-prerequisite errors nameabx config initandabx config set.- Invalid shortcut targets explain the mistake.
abx config set shortcuts.<name> "abx template init"now says to drop theabxprefix and prints the command to retry ("template init"). Other unknown targets are grouped by command. The unknown-command hint uses the same example. - SDK wheel injection works for installed
abx.DockerBuilder.inject_sdk_wheelonly knew how to build from a source checkout, so anabxinstalled from PyPI (or the standalone binary, which has nopip) injected nothing and images silently got whateveragent-sandboxwas newest on PyPI. It now downloads the released wheel of the running version from PyPI (SHA-256 verified) and falls back to the Dockerfile's PyPI install only when that is unavailable; source checkouts still build from the working tree, and apyproject.tomlthat is notagent-sandboxis no longer mistaken for the SDK. abx create "<description>"no longer appears hung and no longer misreports failures. The research round is bounded (20 turns, 240 s;ABX_QWEN_RESEARCH_TIMEOUToverrides) and its prompt caps slow web fetches; on timeout or turn exhaustion the CLI warns with the reason. The whole agent process tree (qwen relaunches itself as a child) is now terminated on timeout or Ctrl-C instead of being orphaned. After a failed research round the assessment starts a fresh session, because qwen rejects re-pinning a--session-idthat already exists; this was the cause of the bogus "assessment unavailable; continuing straight to generation" warning.DeployLLMKeyMissingError(E7001) suggestion now mentionsABX_LLM_API_KEYandllm_api_key=.
First stable release. Includes all changes below (formerly tracked as 0.1.0-dev) plus the current cycle:
-
Removed
abx config reset. Clearing is now per key viaabx config set KEY "": the stored value is removed and the key returns to its business default or to not set. An empty string is never stored as a credential or as an override. When an environment variable still overrides the key at runtime, the command says so explicitly without printing its value. Migration: replaceabx config reset --yeswith oneabx config set KEY ""per key you want to clear (e.g.abx config set region ""). -
abx config listshows effective values and their sources. Sources are annotated as(env),(user),(default)or(not set). Keys with a real business default (qwen_code_base_url,qwen_code_model) show the concrete default; keys without one (llm_api_key,llm_base_url,llm_model) show(not set)instead of a blank(default). Secrets stay masked. Migration: consumers parsingconfig listoutput now see source suffixes and(not set)where the old output showed blank defaults. -
abx config initsecret prompts echo one*per character. Previously typed secrets were completely invisible; now every typed or pasted character shows a single*(never the plaintext), with Backspace / Ctrl-C / EOF / Unicode handled correctly. Terminals that cannot render it fall back to the previous no-echo behaviour with an explicit notice. Migration: no action required — the plaintext is never displayed in either mode.
-
abx template installdefault behaviour changed: download → download+build+deploy.installnow fetches the template sources and then builds the Docker image, pushes to ACR, and registers the template via the official API by default — cloud-side operations that can incur Alibaba Cloud costs (ACR storage/traffic, template resources). The previous download-only behaviour is available via--download-only. Migration: add--download-onlytoabx template install/abx installinvocations that should not build and deploy. -
Removed
SerializerType.PICKLE/SerializerType.MSGPACK. The@sandboxdecorator now only supportsserializer="json". Non-JSON serializable return values must be converted todict/list/strbefore returning. Migration: change@sandbox(serializer="pickle")→@sandbox(serializer="json")and ensure return values are JSON-compatible. -
Removed runtime
check_capability()gate from most modules.CommandsModule,FilesModule, andNetworkModuleno longer raiseCapabilityNotSupportedError(E3004) at call time. Exception:CodeContextModuleretains thecodecapability gate — all its methods (run,create_context,list_contexts,restart_context,remove_context) still raise E3004 when thecodecapability is missing (fail-closed). E3004 is also still raised during template resolution / model validation viaresolve_capabilities(). Migration: removetry/except CapabilityNotSupportedErroraroundcommands.*,files.*, andnetwork.*calls; declare required capabilities intemplate.yamlinstead. Keeptry/except CapabilityNotSupportedErroraroundrun_code()/code.*calls if your template may lack thecodecapability. -
Removed
agent_sandbox.integrationssub-module. The LangChain/CrewAI/AutoGen adapter module was an empty abstract placeholder and has been deleted. Migration: useagent.toolsor MCP integration directly. -
Removed
SessionStoreabstract base class. OnlyLocalSessionStoreremains. Thesession/base.pyABC has been deleted. Migration: if you were subclassingSessionStore, switch toLocalSessionStoreor implement your own storage directly. -
SecretStorechanged from macOS Keychain to file-based storage. Secrets are now stored in~/.abx/secrets.json(plaintext, chmod 600). Old Keychain entries are not automatically migrated. Migration: re-add secrets via environment variables (E2B_API_KEY,SANDBOX_API_KEY) or~/.abx/.envfile. Useabx config set api_key <value>to persist API keys. -
Removed
abx authCLI command group. Theabx auth login/logout/status/switchcommands have been removed. Migration: useabx config set api_key <value>to persist credentials, or setE2B_API_KEY/SANDBOX_API_KEYenvironment variables directly. -
Removed
abx secretCLI command group. Theabx secret create/list/delete/injectcommands have been removed. Migration: use environment variables or.envfiles to manage credentials and secrets. For sandbox environment injection, useabx create --env KEY=VALUE. -
Removed
abx session/abx sessionsCLI command group. Theabx sessions list/info/rename/export/import/cleanandabx start/connectcommands have been removed. Migration: session data is still stored locally in~/.abx/sessions/byLocalSessionStore. Use the SDK'sSandbox.connect()API programmatically. -
Removed
abx skillCLI command group. Theabx skill search/install/list/create/publishcommands have been removed. Migration: Skills system is a future planned feature. Use templates as the current capability distribution mechanism. -
Sandbox.run()is now a bare-shell shortcut (was named-command dispatcher).Sandbox.run(cmd)now delegates tosandbox.commands.run(cmd)and returnsProcessResult | StreamReader. It no longer dispatches named custom commands. Migration: replacesandbox.run("name", **kwargs)withsandbox.custom("name", **kwargs).
Update (2026-09-29, ADR
2026-09-29-init-restore-and-create-explicit-error): item 1 below is superseded — the top-levelabx initshortcut has been restored as an exact alias ofabx template init(same click command object, option surface unchanged). Items 2–3 stand, and item 3 replaces the earlier "abx create(no arguments) uses thebasetemplate" routing.
-
Removed the top-levelSuperseded: restored. The top-levelabx initshortcut.abx initshortcut is back and delegates to the exact same command object asabx template init(options unchanged). Guided credentials setup remainsabx config init; cloud sandbox creation remainsabx create. Migration:abx init [DIRECTORY]andabx template init [DIRECTORY]are interchangeable again. -
abx create "DESCRIPTION" --template NAMEis now rejected. Previously--templatesilently won and the description was ignored. Passing both now raises a usage error (exit code 1) before any AI generation or network call — neither input is silently dropped. Migration: keep DESCRIPTION for the Qwen Code AI path, or--templatefor a direct launch, but not both. -
abx createwith no arguments is now an explicit usage error (exit code 2). Previously bareabx createsilently launched thebasetemplate. It now prints a routing hint (--template base,--template <NAME>, or"DESCRIPTION"for the AI path) so the choice is always explicit. Migration: useabx create --template baseto launch the base template.
-
Unknown top-level commands now get targeted hints. A close spelling candidate (e.g.
abx crate) gets aDid you mean 'create'?suggestion; with no plausible candidate the error points to templatecustom_commands(declared intemplate.yaml) and running them viaabx run COMMAND. Exit code 2 and stderr-only output are preserved; only the root group is affected. -
Top-level shortcut registration is explicit. Built-in top-level shortcuts (
create,list,init,install,deploy,run, …) are registered in theLazyGroup(lazy_subcommands=...)map insrc/agent_sandbox/cli/main.py. This map is a maintainer-facing registration point for the built-in top-level entry points.(Historical note: an earlier CLI design draft rejected a
[shortcuts]config section. This decision was superseded by ADR2026-09-30-configurable-cli-shortcuts.md:[shortcuts]is now implemented as a user-configurable alias layer — see the [Unreleased] Configurable CLI shortcuts entry.)
- Renamed the qwen-code session-turns parameter to
max_session_turns/--max-session-turnseverywhere (SDK, CLI, qwen-code templatetemplate.yaml/commands.py, docs). The old names were misleading:Sandbox.deploy(max_tool_calls=...),DeployModule.deploy_project(max_tool_calls=...), andabx deploy --max-tool-callsall forwarded the value to qwen-code's official--max-session-turnsflag (user/model/tool turn cap, exit code 53), not to the semantically different upstream--max-tool-callsbudget (cumulative tool calls, exit code 55). The pre-existing template argmax_turnsis renamed for the same reason and its default is unified to100. Migration: renamemax_tool_calls=→max_session_turns=,--max-tool-calls→--max-session-turns, and template argmax_turns→max_session_turns. Old names fail loudly (CLI usage error / SDKTypeError); no aliases are kept, matching the pre-release no-compat-shim policy. run_qwen_code_headless()/_build_headless_command()accept an optionalmax_session_turnskeyword (Noneby default adds no flag). This is the stable naming contract for the natural-languageabx createpipeline and future headless callers.
- The template catalog moved to the dedicated repository
alibaba-agent-sandbox/awesome-templates. Template content, the machine-readable index (awesome-templates.yaml), releases and CI now live there — it is the single source of truth for official & community templates. This repository no longer bundles the template collection:examples/templates/keeps only a minimalpython-hellooffline fixture, explicitly marked as a fixture (not a publishing source). The repository-rootawesome-templates.yamlhas been removed. Migration: instead of deploying a bundled folder (e.g.abx template deploy ./examples/templates/node-web), install from the index (abx template install node-web) or reference the source repo directly (abx template install alibaba-agent-sandbox/awesome-templates//node-web@v1.0.0). abx template search/abx template install <bare-name>now resolve against the remote index (cached under~/.abx/index/). Bare names that are not builtins are looked up in the index; a miss triggers one forced refresh, and the resolvedowner/repo//subdir[@ref]is printed (Resolved '<name>' via the template index: ...). Migration: no action needed for directowner/reporeferences; bare names must exist in the index. Use--index-url/ABX_TEMPLATE_INDEX_URLfor private mirrors.
- Remote template index client (
agent_sandbox.utils.template_index): fetchesawesome-templates.yamlfrom the SSOT repository viaraw.githubusercontent.com(CDN — not subject to the API 60 req/hour anonymous limit), with a~/.abx/index/cache, 1-hour TTL,If-None-Matchrevalidation, and explicit degraded modes (stale-cache fallback with a warning on network failures / rate limits / 5xx; loud errors with remediation when no cache exists;schema_versionnewer than supported fails with an upgrade hint).--index-url/ABX_TEMPLATE_INDEX_URLand--token/GITHUB_TOKENare supported. SKILL.md: Static Agent Skills–style usage guide at the repository root for AI coding tools and agents in other projects — covers when to use, install, credential safety (including never-leak rules), MCP vs SDK selection, sandbox create/execute/files/destroy workflows, and common error diagnosis. Referenced fromllms.txt. Documentation only: the removedabx skillcommand group, Skills registry, and runtime are not restored (ADR 2026-09-29). Shipped in the sdist but not the wheel (evidence:tests/test_packaging.py; guide/code consistency:tests/test_agent_guide.py).Sandbox.custom(name, *, server_port=9000, **kwargs) -> CommandResult: New method for named custom-command dispatch. Uses A→B resolution: first tries templatecustom_commands(mechanism A), then falls back to@registry.commandon SandboxServer (mechanism B). ReturnsCommandResultwithvalue,stdout,stderr,exit_code,execution_time,source("template"|"server"), andsuccessproperty.CommandResultdata model: Structured return type forcustom()replacing the bareAnythatrun_command()returned.abx template init: New scaffold command that generates a complete template project from built-in cases (python,node,minimal) or an existing registry reference (--from). Includes interactive case selection on TTY.github_tokenconfig key (abx config set github_token): persistent GitHub token for template downloads, mapped to theGITHUB_TOKENenvironment variable and stored in~/.abx/.env(chmod 600). In an interactive terminal the value may be omitted — the token is read through the existing masked (asterisk) input and never echoed;abx config get/abx config listshow it masked, andabx config set github_token ""removes it. Resolution order:--token> processGITHUB_TOKEN> storedgithub_token> no token.- One-shot GitHub rate-limit onboarding (E5000):
abx template search/abx template install(abx install) now print the officially documented fine-grained PAT prefill URL when the anonymous limit (60/hour) is hit — public repositories need no extra permissions and a 90-day expiry is recommended. In an interactive terminal only, the CLI offers to store the token with masked input and retries the failed operation exactly once; declining, cancelling, or a retry that fails again surfaces the original error. CI / non-interactive sessions are told to injectGITHUB_TOKENas a secret or to runabx config set github_tokenin a terminal. The CLI never runsgh auth token, never opens a browser, and never prints or logs a token. - Unified rate-limit guidance (
agent_sandbox.utils.github_token): shared headline + remediation used by the registry tarball client and the template-index client;owner/repo//subdir@refreferences are preserved verbatim in download errors (e.g.alibaba-agent-sandbox/awesome-templates//codex-agent-api@v1.0).
Sandbox.run_command()/Sandbox.run_command_sync(): Deprecated in favour ofSandbox.custom()/Sandbox.custom_sync(). Both deprecated methods wrapcustom()internally but only returnresult.value(typeAny) for backward compatibility — the fullCommandResult(withstdout,stderr,exit_code,execution_time,source,success) is discarded. If you were treating the old return value as aProcessResult, migrate tocustom()/custom_sync()which return the completeCommandResult. Will be removed in a future release.
-
abx template build-localwas removed and replaced byabx template build. The oldbuild-localcommand name no longer exists (invoking it fails withNo such command 'build-local').abx template buildruns the full pipeline: local Docker build → ACR push → template registration, andabx template deployremains an alias invoking the same pipeline. Migration: replaceabx template build-local <DIR>withabx template build <DIR>(same option surface). -
abx template build/template deploydefault to the official CreateTemplate API. The legacy v3/v2 platform API is no longer the default; it remains available behind the explicit--legacy-apiflag (the approved convergence decision — the default switched to the official API while the legacy code path stays behind a flag). The ACR push and the remote template registration are cloud-side operations that can incur Alibaba Cloud costs (ACR storage/traffic, template resources). Migration: scripts needing the legacy v3/v2 behaviour must pass--legacy-apiexplicitly.
--tokenis documented as a temporary override:abx template install/abx template searchhelp now warns that--token <value>may leak into shell history and process listings, and recommends the persistentabx config set github_tokenas the default fix.commands.run(),commands.stream(), andcommands.start()now auto-wrap commands containing unquoted shell operators (|,;,&&,||,>,<,(...),$(...)) insh -c. Variable expansion ($VAR), backticks, and globs still require explicitsh -c '...'.abx template build(renamed frombuild-local): default mode switched to the official CreateTemplate API (--official-api). Legacy v3/v2 behaviour now requires an explicit--legacy-apiflag.- Official template path prerequisites:
abx template createandabx template build(default mode) now require thealicloudextra (pip install "agent-sandbox-client[cli,alicloud]"orpip install "agent-sandbox-client[alicloud]") and Alibaba Cloud AK/SK credentials. - When
envdInjectis enabled and--target-imageis omitted,copy.imageis now auto-derived with a-fcsandbox-<hex>random suffix to satisfy the platform requirement thatcopy.imagemust differ fromsandboxConfig.image. For a stable tag, pass--target-imageexplicitly.
- Replace
abx template build-local <DIR>withabx template build <DIR>— the old command name was removed. - Existing automation scripts invoking the build pipeline without
--legacy-apinow hit the official CreateTemplate API. To preserve the legacy v3/v2 behaviour, add--legacy-apito the command. - Automation / CI hardening: pass
--acr-namespaceand the template directory explicitly on the command line instead of relying onACR_NAMESPACE/ABX_TEMPLATE_DIRenvironment variables or.envfiles, so builds cannot silently drift with the surrounding environment. Forabx template install/abx install, either pass--acr-namespaceexplicitly or use--download-onlywhen the pipeline must not touch the cloud at all.
- Server Module: Container-side HTTP server (
agent_sandbox.server) expanded from 6 to 42 endpoints across 8 capability groups (CORE, COMMANDS, FILE_OPS, PROCESS, SYSTEM, TERMINAL, DEV_TOOLS, BROWSER) - Server CapabilityGroup.BROWSER: New browser automation capability group with 8 Playwright-backed endpoints (navigate, screenshot, content, click, type, evaluate, pdf, console)
- Server PTY Terminal: WebSocket-based interactive PTY terminal system with session management (REST create/list/delete + WebSocket I/O)
- Server SSE Shell: Streaming shell execution via Server-Sent Events (
POST /shell/stream) for real-time command output - Server RouteTable: Declarative route registry replacing if/elif dispatch; capability groups can be toggled at runtime or via
ABX_SERVER_DISABLED_GROUPSenv var - CLI
abx sandbox files: 6 file-operation subcommands —list,stat,mkdir,rm,mv,search - CLI
abx sandbox process: 4 process-management subcommands —list,start,info,signal - CLI
abx sandbox system: 5 system-info subcommands —info,env,ports,packages,metrics - CLI
abx sandbox capabilities: Show supported capability groups of a sandbox - CLI
abx sandbox shell-stream: Real-time streaming command execution (SSE-backed) - CLI Global Options: Added
--ci(CI/CD mode: quiet + no-color + json),--log-level(explicit DEBUG/INFO/WARNING/ERROR) - CLI OutputManager: Unified output manager (
cli/output.py) with TTY/CI auto-detection, replacing ad-hoc click.echo calls - Template Migration: All 10 templates migrated to new
CapabilityGroupAPI - Core SDK:
Sandboxclass withcreate(),connect(),kill(),run_code()and async context manager - Commands Module:
run(),stream(),start()for executing commands in sandboxes - Files Module:
read(),write(),list(),upload(),download(),exists(),remove(),make_dir() - Network Module: Port URL and access headers calculation (
get_host(),get_url(),get_access_headers()). - Code Interpreter:
run()for code execution with multi-language support - CLI (
abx):create,list,info,kill,exec,shell,auth,configcommands - Dual Authentication: API Key (
SANDBOX_API_KEY) and AK/SK (ALICLOUD_ACCESS_KEY_ID/SECRET) - Connect Protocol: Full
application/connect+jsonimplementation with Server-Streaming support - Transport Layer: HTTP/2 connection pooling, WebSocket with heartbeat/reconnect, layered configuration
- Error System: Structured exceptions with error codes (E1001-E5002), suggestions, and docs URLs
- E2B Compatibility: Drop-in compatible
compat.Sandboxwrapper - Output Formats: Table (rich), JSON, and quiet modes for CLI
- Sync Support: All async methods have synchronous variants via
run_sync() - Community Template Index:
awesome-templates.yaml— curated index of official and community sandbox templates
- Network Module: Removed experimental
expose()andlist_ports()APIs in favor of a simpler local URL calculation interface based on official documentation. Port URL is now computed client-side ashttps://{port}-sbx-{sandbox_id}.{domain}.
- Six-layer architecture: Transport → Protocol → Extensions → API → Declarative → Agent Integration (+ CLI + Server)
- Async-first design with sync wrappers
- Lazy imports for fast CLI startup (< 200ms)
- Domain-partitioned HTTP connection pools (Platform API vs envd API)