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.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 | Provenance | Actions |
|---|---|---|---|---|
| kosa8-0.3.0.tar.gz | 41.5 kB | Without provenance | Details for kosa8-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| kosa8-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for kosa8-0.3.0-py3-none-any.whl |
Total release size: 77.6 kB
Release files / kosa8-0.3.0.tar.gz
| Download URL | kosa8-0.3.0.tar.gz |
|---|---|
| Size | 41.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
39f6b2a8d155d8ea91d041a9c0c74e5c249383ae3d71da761b0d12584c01cb6d
|
|
BLAKE2b-256 checksum How to use checksums |
527ab0499700cedaa3f002590f92ae8fae4796ef588473e2abb1351fa2004cb8
|
| 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.0-py3-none-any.whl
| Download URL | kosa8-0.3.0-py3-none-any.whl |
|---|---|
| Size | 36.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2f083b62dd153a1cb5c3e119fb8139247ebb75088c9a08e75752b4d435928402
|
|
BLAKE2b-256 checksum How to use checksums |
69d4afc74d2ac3e9cff73738249c1c32c0e81907f94e7bce50c125f84dc09286
|
| 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.0
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.