Send one API request. Komputer gives your agent a machine, keeps its state in your own Postgres, and streams every step back to your app.
from komputer import ClaudeSDKAgent analyst = ClaudeSDKAgent( "analyst", system_prompt="You analyse contracts.", tools=[lookup_vendor], # these run in your app ) # a message arrives from your product s = analyst.session("acme-contracts") await s.send("Analyze these 40 contracts") # that's it
import { ClaudeSDKAgent } from "komputer"; const analyst = new ClaudeSDKAgent("analyst", { systemPrompt: "You analyse contracts.", tools: [lookupVendor], // these run in your app }); // a message arrives from your product const s = analyst.session("acme-contracts"); await s.send("Analyze these 40 contracts"); // that's it
# komputer mounts a router inside your app. # the base URL is yours. there is no service of ours to call. curl -X POST https://your-app.com/komputer/sessions/acme-contracts \ -H "content-type: application/json" \ -d '{"text":"Analyze these 40 contracts"}' # that's it
Your app hands us a message and moves on. No long-lived request to keep alive, no queue to babysit, no machine to provision.
A session is just a name. The box shuts down after ten idle minutes and costs nothing while it's off. Send to that name again, an hour later or a week later, and it's back in about two seconds with its files, its history and its scratch space exactly where they were.
s = analyst.session("acme-contracts")await s.send("Analyze these 40 contracts") async for event in s.stream(): ui.push(event) # 15 minutes pass. the box slept after 10. s = analyst.session("acme-contracts") # same nameawait s.send("Now flag anything auto-renewing")
No warm pool, no keep-alive, no cache to prime. The name is the state, and it lives in your Postgres.
No new datastore to run, no vendor holding your agent's memory. Point Komputer at a connection string and it mounts onto the database you already have.
# your Supabase project, or anything that speaks Postgres KOMPUTER_DATABASE_URL=postgresql://...supabase.co:5432/postgres
Komputer creates its own schema and stays out of yours. Your agent's memory is rows you already know how to read, back up and join against the rest of your data.
| komputer.sessions | one row per conversation |
| komputer.events | the append-only log |
| komputer.turns | what ran, and what it cost |
| komputer.files | archived filesystems |
Delete the schema and Komputer is gone. Nothing else in your database moves.
Komputer is a library you import, not a service you deploy. It ships inside the process you already run, and everything underneath it is infrastructure you already own.
One command, pointed at your own app. Every session, every turn, the tools it called, which box it ran on and what it cost.
Install the library, point it at a Postgres, pick a container backend. There is no control plane of ours in the path, so there is nothing to sign up for before it works.
# 1. install pip install komputer # 2. point it at a Postgres you already have export KOMPUTER_DATABASE_URL=postgres://... # 3. pick where boxes run export KOMPUTER_BACKEND=docker # 4. mount the router in your app, then watch npx komputer-ui --at http://localhost:8000/komputer
Point Komputer at an agent you already have and a Postgres you already run. First box up in under a minute.