Skip to main content

kosa8 for Python

Python client for kosa8: microVM sandboxes for AI agents, with checkpoint, rewind, fork and explore. The counterpart of @kosa8/sdk, method for method.

No dependencies. It talks to the local kosa8 daemon over its unix socket, or to a remote kosa8 worker.

pip install kosa8

Quickstart

from kosa8 import Kosa8Client

k = Kosa8Client()
k.create_sandbox(name="demo", egress="deny")   # a microVM with its own kernel, no network
sb = k.sandbox("demo")

sb.pull("alpine:latest")
print(sb.run("alpine:latest", ["sh", "-c", "echo hello"]).stdout)

sb.checkpoint(label="before the risky bit")    # memory, processes and disk
sb.run("alpine:latest", ["sh", "-c", "rm -rf /data"])
sb.rewind()                                    # back, processes resumed

forks = sb.fork(4)                             # four live copies
sb.delete()

What's in it

Area Methods
Status health, version
Sandboxes create_sandbox, list_sandboxes, get_sandbox, start_sandbox, stop_sandbox, delete_sandbox
Images pull, pull_into_sandbox, sandbox_images
Running code run, exec, exec_frames, start_container, start_interactive, write_stdin, attach
Network sandbox_egress; egress="deny" | "any" | "fakenet" or egress_allow=[...] on create
Snapshots snapshot, list_snapshots, restore_snapshot, delete_snapshot
Fork fork(sandbox, n), explore(sandbox, variants) (best-of-N)
Checkpoints checkpoint, list_checkpoints, rewind

k.sandbox(id) returns a handle with the same methods bound to one sandbox.

Checkpoints share the CLI's store (~/.kosa8/checkpoints.json, under the same flock), so kosa8 rewind sees checkpoints taken here and the other way round.

Toolbox

sbx = client.sandbox("agent-1")
r = sbx.run_code("import math; print(math.pi)")          # CodeResult: stdout, exit_code, artifacts
sbx.shell("cd /workspace && git init demo")               # cd and export persist
sbx.write_file("demo/app.py", "print('hi')")
print(sbx.read_text("demo/app.py"))
sbx.shell("cd demo && python3 -m http.server 8000 >/dev/null 2>&1 &")
print(sbx.preview(8000)["url"])                           # signed, expiring link
client.create_sandbox(name="scratch", ephemeral=True, auto_stop_min=15)

Agent frameworks

from kosa8.integrations.openai_agents import sandbox_tools   # pip install 'kosa8[openai-agents]'
agent = Agent(name="coder", tools=sandbox_tools(client, "agent-1"))

from kosa8.integrations.langchain import sandbox_tools       # pip install 'kosa8[langchain]'
agent = create_react_agent(model, sandbox_tools(client, "agent-1"))

Guides: https://docs.kosa8.com/guides/py-frameworks/ and https://docs.kosa8.com/guides/py-rl-eval/.

Connecting

Setting Default
socket_path= ~/.kosa8/run/kosa8.sock
host= / KOSA8_HOST a remote worker: https://…, tcp://host:port, unix:///path
token= / KOSA8_TOKEN the worker's bearer token
insecure= / KOSA8_INSECURE=1 allow plain http to a non-loopback host (off)
actor= tool; recorded in the audit log as human, agent or tool
agent_token= / KOSA8_AGENT_TOKEN agent identity for the audit log
timeout= seconds per connect and read; None waits
worker_file= ~/.kosa8/worker.json, the CLI's saved worker connection; False reads none

Where requests go, in order: host= or KOSA8_HOST; else the connection the CLI saved (kosa8 wsl setup on Windows, where the engine runs in WSL2, or kosa8 worker join anywhere), with its token; else the local daemon's socket. So on Windows, once kosa8 wsl setup has run, Kosa8Client() reaches the WSL2 engine with no configuration.

kosa8 Cloud

The same sandboxes on kosa8 Cloud instead of the local daemon. Make an API key in the cloud dashboard and set KOSA8_API_KEY.

from kosa8 import Kosa8Cloud, Kosa8PaymentRequiredError

cloud = Kosa8Cloud()  # or Kosa8Cloud("k8c_live_...")

box = cloud.sandboxes.create(template="python", sleep_after_s=600)
r = box.exec(["python3", "-c", "print(6 * 7)"])
print(r.exit_code, r.stdout)    # 0 42
box.sleep()                     # costs only snapshot storage while asleep
box.exec("ls /workspace")       # wakes it, files and all
box.delete()

cloud.functions.deploy("hello", {
    "runtime": "python3.12",
    "code": 'def handler(event):\n    return {"hello": event.get("name", "world")}\n',
})
out = cloud.functions.invoke("hello", {"name": "kosa8"})
print(out["ok"], out["result"])  # True {'hello': 'kosa8'}

A new organization runs nothing until a payment method is on file; until then creating a sandbox raises Kosa8PaymentRequiredError (code payment_required), whose message says what to do. Every error from the cloud carries its stable code.

Errors

Every daemon error is raised as a typed exception carrying the daemon's own message and remediation: Kosa8BadRequestError (400), Kosa8AuthError (401), Kosa8PolicyError (403), Kosa8ApprovalRequiredError (403 needing a signed approval: repeat the call with approval=<id>), Kosa8NotFoundError (404), Kosa8ConflictError (409), Kosa8UnsupportedError (501), Kosa8ConnectionError, Kosa8StreamError (output kept), Kosa8TimeoutError.

Tests

PYTHONPATH=src:tests python3 -m unittest discover -s tests

License

MIT

Metadata

Release files for kosa8 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kosa8 0.3.1
File Size Uploaded Provenance Actions
kosa8-0.3.1.tar.gz 41.6 kB Without provenance Details for kosa8-0.3.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for kosa8 0.3.1
File Interpreter ABI Platform Actions
kosa8-0.3.1-py3-none-any.whl Python 3 none any Details for kosa8-0.3.1-py3-none-any.whl

Total release size: 77.7 kB

Release files / kosa8-0.3.1.tar.gz

Download URL kosa8-0.3.1.tar.gz
Size 41.6 kB
Tags Source
SHA-256 checksum
How to use checksums
0017f1f89619478fdae79b36085d11df0a52e676b61923685b1590294e645ce3
BLAKE2b-256 checksum
How to use checksums
db1247c00217a777360f0656f864f62ad7b13e4c3d7488179689df44429acaf0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Release files / kosa8-0.3.1-py3-none-any.whl

Download URL kosa8-0.3.1-py3-none-any.whl
Size 36.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8f9b92d57700dd1d641c93d8269a04a276701598852f3e718fa06e37e254b979
BLAKE2b-256 checksum
How to use checksums
c30cfb42fdcc3b7e5b126ea1137162f8e922099ae94f34488f16626f35732780
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Security for kosa8 0.3.1

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page