microvms
Run coding agents and their tools in sandboxed AWS Lambda MicroVMs. Give each
task its own Linux workspace, execute commands, collect files, and terminate
the VM from Python. AgentVm runs Claude Code or Codex through Amazon
Bedrock; Sandbox supports your own agent or command runner.
Install
python3 -m venv .venv
. .venv/bin/activate
python -m pip install microvms
Requires CPython 3.9+. On Windows, activate with
.venv\Scripts\Activate.ps1 in PowerShell. Wheels ship for Linux x64/ARM64
(glibc), macOS Intel/Apple Silicon, and Windows x64. Type declarations are included.
Run your first command
With an existing image and AWS credentials, this is the 90-second path to a working SDK example. One-time AWS setup and image builds take longer.
You need Lambda MicroVMs access, your normal AWS credential configuration,
and an execution role. Follow AWS setup
to set AWS_REGION and MICROVM_EXECUTION_ROLE_ARN. Then use the
CLI
to prepare an image containing agentd:
microvm build --name agent-tools --json
export MICROVM_IMAGE='paste data.imageIdentifier from the result'
Use the image ARN, in the same account and region as your credentials.
The CLI can resolve image names; the SDK example takes the ARN directly.
The CLI provisions agentd and uploads the build artifact for you. Shell
examples use Bash or Zsh; in PowerShell, set variables with $env:NAME='value'.
Save as hello.py:
import os
import sys
from microvms import Region, Sandbox
image = os.environ["MICROVM_IMAGE"]
role = os.environ["MICROVM_EXECUTION_ROLE_ARN"]
vm = Sandbox(Region.parse(os.environ.get("AWS_REGION", "us-east-1")))
try:
session = vm.run(image_identifier=image, execution_role_arn=role)
result = session.run_sync(["echo", "hello from a sandbox"])
print(result.stdout, end="")
print(result.stderr, end="", file=sys.stderr)
if not result.ok:
raise RuntimeError(f"Command exited with {result.exit_code}")
finally:
cleanup = vm.terminate()
if cleanup.failures or cleanup.undeleted:
print("Cleanup needs attention:", cleanup.to_dict(), file=sys.stderr)
python hello.py
Expected output: hello from a sandbox. The VM is terminated after the
command; the image stays available for reuse. terminate() returns once
termination is accepted by default. Pass wait_for_terminated=True to
wait for the final state. Inspect failures and undeleted because cleanup
reports failures in its result.
Run a coding agent
First prepare a Claude Code image using the same AWS setup plus Bedrock permissions. This builds or reuses the agent image and starts a temporary VM. Capture only its image ARN, then terminate that temporary VM:
MICROVM_AGENT_IMAGE="$(microvm agent-up --vm-name sdk-image --agent claude-code --json |
python -c 'import json, sys; print(json.load(sys.stdin)["data"]["imageIdentifier"])')"
export MICROVM_AGENT_IMAGE
microvm terminate sdk-image --wait
Save as agent.py. The agent writes a file inside its own VM; the SDK
downloads that file before cleanup:
import os
import sys
from microvms import AgentVm, Region
image = os.environ["MICROVM_AGENT_IMAGE"]
role = os.environ["MICROVM_EXECUTION_ROLE_ARN"]
vm = AgentVm(Region.parse(os.environ.get("AWS_REGION", "us-east-1")))
try:
session = vm.launch(image_identifier=image, execution_role_arn=role)
vm.install_access()
result = vm.prompt_sync(
"claude-code",
"Create /workspace/hello.py that prints hello from a sandbox. Run it.",
)
print(result.stdout, end="")
print(result.stderr, end="", file=sys.stderr)
if not result.ok:
raise RuntimeError(f"Agent exited with {result.exit_code}")
with open("hello-from-agent.py", "wb") as artifact:
artifact.write(session.download_file("/workspace/hello.py"))
finally:
cleanup = vm.terminate()
if cleanup.failures or cleanup.undeleted:
print("Cleanup needs attention:", cleanup.to_dict(), file=sys.stderr)
python agent.py
For Codex, prepare the image with --agent codex, import AgentSpec, create
AgentVm(region, [AgentSpec.codex()]), and prompt "codex".
Agent images must contain the agent you select. Agents run as UID/GID 1000
in /workspace; install_access() installs a short-lived Bedrock token
after launch. AgentVm enables internet egress for model calls.
Next steps
For a Sandbox named vm and its session:
| Need | API |
|---|---|
| Start a task and poll or stream later | session.run(argv) → ExecHandle |
| Wait for and release saved output | handle.wait_and_ack(timeout=60) |
| Keep the VM awake while an exec runs | with session.keep_awake(while_busy=True): ... |
| Upload input or download results | session.upload_file(path, bytes), session.download_file(path) |
| Transfer a directory | session.upload_tar(path, tar_bytes), session.download_tar(path) |
| Freeze and restore a workspace | vm.suspend(), vm.resume() |
Methods are synchronous. run_sync starts a command, waits, and acknowledges
its saved output. A nonzero exit is a result, so check result.ok or
result.exit_code. Use shell=True when passing a shell script string.
Library exceptions expose code, kind, wire_kind, and retryable.
Omitting egress does not block outbound traffic. For no egress, use
egress_network_connectors=[vpc_connector_arn] with a VPC without an internet
gateway, NAT gateway, or other internet route. deny_egress sets advisory proxy variables that
workloads can bypass. Keep the guest execution role limited to the task's needs.
SDK tutorial · API reference · Source · Apache-2.0
Release files for microvms 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| microvms-0.9.0.tar.gz | 703.1 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| microvms-0.9.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| microvms-0.9.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| microvms-0.9.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| microvms-0.9.0-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| microvms-0.9.0-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 16.8 MB
Release files / microvms-0.9.0.tar.gz
| Download URL | microvms-0.9.0.tar.gz |
|---|---|
| Size | 703.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2a14a48140f7ff940efa8a47a56d958ca98104624c3e3cc123b95ffa9f2842f8
|
|
BLAKE2b-256 checksum How to use checksums |
d5b8fe5e7b1428433e1c2273ae846ef49fd5063fcfe944d8c7175bcf7cd71502
|
| 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 Sep 24, 2026.
Transparency logRelease files / microvms-0.9.0-cp39-abi3-win_amd64.whl
| Download URL | microvms-0.9.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
e73ae5e23c1602d6ea81ec63ab8be35367e75b55c825683038a353efb6f2b192
|
|
BLAKE2b-256 checksum How to use checksums |
ed564d7cf3a59f15cd11dd4cc8234403ae7e8a24ac6b502a725164382c6073a2
|
| 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 Sep 24, 2026.
Transparency logRelease files / microvms-0.9.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | microvms-0.9.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.4 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
09d6475df76facd65642a0a81ad69b9316589aeb7892fd88ac93119d11ca9929
|
|
BLAKE2b-256 checksum How to use checksums |
5b3e1d3ceaffb507538bf499ccad002b9f9ae0d458b9e9c1d3dd47d00077acbc
|
| 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 Sep 24, 2026.
Transparency logRelease files / microvms-0.9.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | microvms-0.9.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
993cbc5a5c22a9b8e050e14e31f0880e5705e1f1fc8eb26a4d99c26a7ff97ffe
|
|
BLAKE2b-256 checksum How to use checksums |
9021125b0379c7481817f373f3f21cd97a7f7c9728507e58bb10a13bf2e90ca3
|
| 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 Sep 24, 2026.
Transparency logRelease files / microvms-0.9.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | microvms-0.9.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
373876c0b5e0f11686a13aa96b96444a1bc8d26c7c9d925521d572528ef64d8a
|
|
BLAKE2b-256 checksum How to use checksums |
701606a91aba0f99af49b0580c6f83aa80ab0b19bc9f77cec59aff9da66e09fe
|
| 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 Sep 24, 2026.
Transparency logRelease files / microvms-0.9.0-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | microvms-0.9.0-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ec8760817b5cb97a0d5444c7d3d5961bf79621984b9afbf2534869fd156e3571
|
|
BLAKE2b-256 checksum How to use checksums |
bbebd041067dfef2c2a3fa962715b9e09e96e548f4e05ce40197f4d83c127bf0
|
| 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 Sep 24, 2026.
Transparency log