How GPU for Agents works
A coding agent can only read and write text. With its own GPU it can make images and voices, transcribe audio, run open models and test GPU code on real hardware. GPU for Agents gives it that machine with the controls built in: a budget it can't exceed, a log of every step, and a watchdog on the machine that stops it when the work stops.
01Overview
One command, gpu, rents a GPU from a cloud provider, serves a model or runs code on it, and makes sure it stops. Agents reach it through a skill and an MCP server. Applications call the same command with --json.
Limits in a file
gpu.yaml sets the hourly price cap, the session budget and the maximum lifetime. The agent can't go past them without editing the file you can read.
Every step logged
Each rent, start, idle period, stop and refusal is one JSON line in events.jsonl, with the reason. gpu events reads it.
A watchdog on the GPU
The machine checks itself every 60 seconds and calls the provider to stop itself after 15 idle minutes, even if your laptop is closed.
Two planes
| Plane | What | Who uses it, and how |
|---|---|---|
| Control | the gpu command (and the MCP tools that wrap it) | an agent through MCP; an app as a subprocess with --json, reading stdout and the exit code |
| Data | an OpenAI-compatible HTTP API on the rented machine | any OpenAI SDK or plain HTTP, with the base_url, api_key and model that gpu setup printed |
You never have to stop the GPU yourself. The one thing a client has to handle is a machine that has been stopped: it calls gpu setup again and gets a fresh endpoint.
02Quickstart
Let the agent install it
Paste this into Claude Code, Codex, Gemini CLI or Cursor, naming the one you use:
Set up GPU for Agents for me. I'm using Claude Code. Fetch https://gpu4agents.jambu.ai/install.md with curl and follow its steps.
The agent runs the installer, gives itself the skill and the MCP server, and checks your provider account. Nothing is rented during installation.
Connect the account that pays for the GPUs
When the agent asks, open your terminal app (not the chat) and type gpu login. It takes about two minutes, and the key never passes through the conversation.
Connect a GPU provider, so your agent can rent GPUs on its own. Your key stays on this computer; the agent never sees it. 1) Vast.ai built in; GPUs by the hour from a few cents, pay as you go 2) Another provider I already use RunPod, Lambda, my company's servers, ...: your agent adds it Choose [1]: 1 Vast.ai, in 3 steps: 1. Create a Vast.ai account: https://cloud.vast.ai/ 2. Add some credit ($5 to $10 is plenty to try it): https://cloud.vast.ai/billing/ You pay only while a GPU runs, and idle ones are shut down for you. 3. Create a key and copy it: https://cloud.vast.ai/manage-keys/ Already have an account? Skip to the key. Paste your key here and press Enter (it stays hidden):
The key is checked with the provider before it is saved in ~/.gpu/credentials (mode 600). Pick "Another provider" and the command tells you what to ask your agent: it writes the adapter, then you run gpu login --provider <name>. gpu login --check says whether an account is connected, without changing anything.
gpu runs something else. Oh My Zsh's git plugin, on by default, makes gpu a shortcut for git push upstream, and a shortcut wins over the command, in your terminal and in your agent's. The installer finds it and turns it off for new terminals, with a marked block at the end of ~/.zshrc or ~/.bashrc that you can delete to undo it (--keep-gpu-alias skips this). The same command is always installed as gpu4agents too, so gpu4agents login works either way, and the skill makes the agent check type gpu before using it.Or by hand
$ curl -fsSL https://gpu4agents.jambu.ai/install.sh | sh -s -- --agent auto # or: uv tool install --python 3.12 gpu4agents / pipx install gpu4agents $ gpu init --model Qwen/Qwen2.5-7B-Instruct # writes gpu.yaml $ gpu validate # config, credentials, real capacity; fails before renting $ gpu offers # matching machines and their hourly price $ gpu setup # rent, install the watchdog, serve, wait until ready $ eval "$(gpu env)" # OPENAI_BASE_URL, OPENAI_API_KEY, JAMBU_MODEL_ID
03Architecture
Three places are involved: your machine, the provider's API, and the rented GPU machine. Control goes through the gpu command and the watchdog. Data goes straight from your client to the model on the GPU.
What is in the package
| Module | Does |
|---|---|
core/policy.py | The only shutdown rule. Pure Python, no dependencies. Its source is copied into the watchdog, so the machine and gpu status apply exactly the same rule. |
core/engine.py | setup, restart, reconcile, stop, destroy, jobs; serialized by a file lock per project |
core/state.py, core/events.py | .gpu/state.json and the append-only event log |
providers/ | the provider contract (base.py), the registry, the Vast.ai adapter and the skeleton for new ones |
runtime/, serve/ | how the model runs: vLLM, gpu's own server for any Hugging Face model, or your server |
watchdog/ | the agent that runs on the machine (agent_body.py), its builder, and the jobs extension |
agent/ | the skill, the MCP server and gpu agent install |
The core never checks which provider it is talking to. It checks what the provider can do (provider.capabilities), and a test fails the build if core/ ever mentions a provider by name.
04Process flow: gpu setup
What happens between "rent a GPU" and a working endpoint. The first rent usually takes 5 to 15 minutes, mostly the image pull and the model download. Restarting a stopped machine took 41 seconds for a small model.
Through MCP, setup never blocks the agent
A first rent outlasts any client's tool timeout, so gpu_setup starts setup as a background job, waits up to 45 seconds, and answers status: "running" until the model is ready. Calling it again re-attaches to the same job and never rents a second machine. The job outlives the MCP server, so a restarted client finds it again.
05Lifecycle states
Every provider's states are mapped onto one set, so the CLI and the rule behave the same on any provider.
stopped_ttl (24 h) ends the second.| Event | What a client sees | What it does |
|---|---|---|
first setup | blocks 5 to 15 minutes while the machine is rented and the model downloads | waits; setup bounds itself |
idle for idle_timeout | connection refused or a timeout | calls setup again, retries once |
setup on a stopped machine | restart, no new rent, no new download; the IP and port may change | uses the new base_url |
stopped for stopped_ttl | the machine is gone | the next setup rents a new one, with a new key |
max_lifetime reached | stopped even under traffic | same as idle |
06The watchdog
The CLI process can't be in charge of shutdown: close the laptop and a local timer dies while the GPU keeps billing. So setup installs a watchdog on the machine itself, and the machine stops itself.
Inside the rented machine
A small HTTP service on port 8777, started by the boot script before the model server, inside a bash respawn loop. If it crashes, the loop starts it again 5 seconds later.
Every 60 seconds
It evaluates the same rule as gpu status, from core/policy.py, and reads the model server's /metrics every 15 seconds to see traffic.
Stop or destroy its own machine
The provider adapter injects two calls, provider_stop and provider_destroy. Nothing else of the provider's API is used from the machine.
State on disk
/var/lib/jambu/activity.json survives a stop and start. A restart opens a new session with a fresh lease, so a restarted machine isn't killed the moment it boots.
What counts as activity
| Counts | Does not count |
|---|---|
a running or queued workload with a live heartbeat (gpu run, a job)model startup inference traffic: requests running or waiting, completed requests, prompt tokens an active lock ( gpu lock --for 2h) | a healthy server nobody calls a health check or a metrics scrape an open SSH session a dead heartbeat: after heartbeat_grace (5 min) the workload is stale |
Traffic is read from the server's own counters. The first read only sets a baseline, so old totals don't keep a machine up, and a counter that goes down means the server restarted, so it rebaselines. A failed probe never counts as activity.
When the provider call fails
- A failed stop never disarms the guard. It logs
provider_errorandguard_retryand tries again on the next tick. - If the provider accepted the call but the machine is still running after 5 minutes, the watchdog issues it again (
guard_reissue). - After 30 minutes of failed stops it destroys the machine instead (
stop_failed_escalation): a machine that bills forever costs more than a lost disk.
A second line of defense
The same rule runs from outside too. gpu guard evaluates it from cron or CI, and gpu sweep --install-timer runs every 5 minutes over every registered project, then stops orphans running longer than 24 hours and destroys orphans stopped longer than 24 hours. It only ever sees machines labeled jambu-; nothing else in the account is touched. It's a dry run until --apply.
07The shutdown rule
One pure function, evaluate(snapshot, config), decides whether a machine may keep billing. It checks in this order and stops at the first answer. Every automatic shutdown records its reason.
stopped_ttl, not lockedmax_lifetime (6 h)?measured from the last start, not from creationmax_session_cost_usd?hourly price × session agegpu lock --for 2h; indefinite locks only if the project allows themheartbeat_graceidle_timeout (15 min)?"STOP" is the cheapest action that ends billing: a stop where a stopped machine is free, a destroy with auto_destroy: true or when the provider can't stop. gpu status prints the decision it would take right now, so you can see the watchdog's next move before it happens.
08Data flow
What lives where, what crosses the network, and which secrets go where.
Files on your machine
| Path | Holds | Secret |
|---|---|---|
gpu.yaml | what to run and how long it may live; credentials are refused here | no |
~/.gpu/credentials or .env | the provider key, written by gpu login (mode 600) | yes |
.gpu/state.json | the rented instance, the endpoint key, the watchdog token (mode 600) | yes |
.gpu/logs/events.jsonl | the event log of this project | no |
~/.gpu/projects.json | projects registered by setup, guarded by gpu sweep | no |
~/.gpu/sweep.json, bad_hosts.json | when orphans were first seen stopped; hosts that failed to boot (skipped for 24 h) | no |
Keep .gpu/ on persistent storage. A container that loses it forgets its instance and rents a second one, leaving the first to the watchdog and the sweep. Add .gpu/ and .env to .gitignore.
09Audit and cost
Every lifecycle action appends one JSON object to the event log, so any GPU cost can be traced back to a decision and a reason. The watchdog keeps its own log on the machine, and gpu status and gpu events merge it into yours.
$ gpu events # the lifecycle log, newest last $ gpu --json status # state, cost so far, idle time, the watchdog's next move $ gpu ls # every jambu- machine in the account, and which project owns it
Each line carries ts, event and pid, plus the project's context (instance id, provider) and the event's own fields, such as the reason, the price or the decision detail.
A real session, from the event log
sd-turbo on one RTX 3060 at $0.065/h, 4 Nov 2026 (UTC). The machine was rented, served images, went quiet, and stopped itself.
Show as a table
| Time (UTC) | Event | Detail |
|---|---|---|
| 02:23:25 | provision_requested | sd-turbo, min 12 GB VRAM |
| 02:23:26 | instance_created | RTX 3060, $0.065/h |
| 02:25:18 | watchdog_started | idle_timeout 900 s |
| 02:26:27 | runtime_ready | startup 65.8 s |
| 02:35:18 | instance_idle | pending_workloads 0 |
| 02:50:43 | state_reconciled | idle → stopped |
What that session cost, against leaving it on
GPU cost over 24 hours at the same $0.065/h. The solid line is what happened; the dashed line is the same machine with nobody watching it.
Show as a table
| After | With the watchdog | Left running |
|---|---|---|
| 1 h | $0.03 | $0.07 |
| 8 h | $0.03 | $0.52 |
| 24 h | $0.03 | $1.56 |
stopped_ttl destroys it; the chart shows GPU time only.Event vocabulary
| Group | Events |
|---|---|
| Rent and boot | provision_requested budget_rejected instance_created host_failed runtime_starting runtime_ready setup_failed cleanup_performed |
| Work | workload_started workload_finished job_submitted job_finished job_outputs_pulled |
| Lifecycle | instance_idle instance_locked instance_unlocked lifecycle_guard_triggered instance_stopped instance_started instance_destroyed state_reconciled |
| Watchdog | watchdog_started watchdog_identified session_started runtime_exited guard_retry guard_reissue activity_probe_error |
| Errors and sweep | provider_error watchdog_error sweep_action (in ~/.gpu/logs/events.jsonl) |
10Integrating a coding agent
The agent gets two things: a skill that teaches it the rules, and a local MCP server that exposes the gpu commands as tools.
| Agent | Skill | MCP server |
|---|---|---|
| Claude Code | .claude/skills/gpu4agents/ | .mcp.json, or user scope with --global |
| Codex | .agents/skills/gpu4agents/ | [mcp_servers.gpu] in ~/.codex/config.toml |
| Gemini CLI | .agents/skills/gpu4agents/ | mcpServers.gpu in .gemini/settings.json |
| Cursor | .agents/skills/gpu4agents/ | .cursor/mcp.json |
| Claude Desktop | ~/.gpu/gpu-skill.zip, uploaded under Settings | claude_desktop_config.json |
$ gpu agent install -t claude # this project; --global for every project $ gpu agent install -t auto --global # every agent found on this machine $ gpu mcp --project /path/to/project # any other MCP client, over stdio
What keeps the agent in line
- The skill tells it to show the price and ask before renting, to wait out a slow setup instead of starting over, never to touch the provider key, and to offer stop or destroy when done.
- The tools are annotated:
gpu_destroyis marked destructive and the read-only tools read-only, so your client can letgpu_statusrun freely and ask for everygpu_setup. In Claude Code:"allow": ["mcp__gpu__gpu_status", "mcp__gpu__gpu_offers", "mcp__gpu__gpu_ls"]. gpu.yamlholds the hard limits. The agent can't raise them without editing a file you can see in the diff.- The watchdog stops the machine whatever the agent does, and the sweep catches anything left behind.
11Integrating an application
No SDK. An app in any language runs gpu --json setup, reads the JSON, and points its OpenAI client at the result. When a request fails because the machine is gone, it runs setup again and retries once.
gpu --json setup at boot or on the first requestbase_urlimport json, subprocess from openai import OpenAI, APIConnectionError def ensure_gpu(cwd="/srv/my-app"): out = subprocess.run(["gpu", "--json", "setup"], cwd=cwd, check=True, capture_output=True, text=True).stdout return json.loads(out) conn = ensure_gpu() def ask(prompt): global conn for attempt in (1, 2): client = OpenAI(base_url=conn["base_url"], api_key=conn["api_key"], max_retries=0, timeout=120) try: return client.chat.completions.create( model=conn["model"], messages=[{"role": "user", "content": prompt}] ).choices[0].message.content except APIConnectionError: if attempt == 2: raise conn = ensure_gpu() # stopped while idle: restart it, then retry
Retry only on connection errors. A 400 or 401 comes from a live server. For TypeScript, examples/typescript-client/src/gpu.ts is one file with no dependencies that does all of this.
Short jobs: wrap them
$ gpu run python score.py --input data.jsonl # heartbeats keep the machine up while it runs $ gpu lock --for 3h && ./batch.sh; gpu unlock # a batch with quiet stretches longer than idle_timeout
gpu run sets OPENAI_BASE_URL, OPENAI_API_KEY, JAMBU_MODEL_ID, JAMBU_GPU_ENDPOINT and the instance identity, so any OpenAI SDK picks the endpoint up by itself.
12Serving models
gpu init --model <repo> reads the Hugging Face model card and picks the engine and the OpenAI routes. Any OpenAI client works unchanged.
| The model | Engine | Routes |
|---|---|---|
| chat, vision-language | vllm | /v1/chat/completions (with tools) · /v1/completions · /v1/responses |
| images (diffusers) | hf | /v1/images/generations |
| voice | hf | /v1/audio/speech |
| transcription | hf | /v1/audio/transcriptions · /v1/audio/translations |
| embeddings | hf | /v1/embeddings |
| any other pipeline (detection, depth, …) | hf | /v1/pipeline |
| a model none of these load | custom | yours, from a server the agent writes |
| no server, only jobs | none | none |
GET /v1/models lists the model, its task and its routes. Changing the model keeps the machine: edit model.id and run gpu setup, which redeploys on the same GPU. Use models as their licenses and your purpose allow; open models with their own policies are for legitimate work you own, such as research, evaluation, red-teaming your own systems and creative work.
The custom server contract
- Listen on
0.0.0.0:$PORT. - Answer
GET /healthwith 503 until the model is loaded, then 200. - Require
Authorization: Bearer $JAMBU_API_KEYon every route except/healthand/metrics. - Serve
/metricswithjambu_requests_running(gauge) andjambu_requests_total(counter). Without them requests don't count as activity, and the machine stops afteridle_timeouteven while in use. - Use the OpenAI request and response shapes where one exists.
- Exit non-zero when loading fails, after printing why. Never print secrets.
13Running jobs
A job is the agent's own code on the GPU: training, a kernel benchmark, a batch over a dataset. gpu job run packs it, runs it, streams the log and brings the outputs back.
.git, venvs, .env (≤ 2 GB)PUT /jobs/<id>/bundlesetup: then run:, with a timeout$JAMBU_OUTPUT_DIR → gpu-outputs/<id>/run: python train.py --epochs 3 setup: pip install -r requirements.txt env: EPOCHS: "3" timeout: 2h exclude: [data/raw, "*.ckpt"] label: lora-qwen-7b
$ gpu init --jobs --min-vram-gb 24 $ gpu job run $ gpu job run -- python test_kernel.py $ gpu job status # state, exit, cost_usd $ gpu job logs -f $ gpu job pull # works mid-run $ gpu job cancel
Job states: running, succeeded, failed, timeout (exit 124), cancelled (exit 130), lost (the machine restarted under it). The provider credential the watchdog uses is removed from the job's environment.
14Contract: CLI output
Pass --json before the command name. stdout then carries exactly one JSON document; errors go to stderr as one line, error: <message>, with a non-zero exit code.
| Command | Use it to | Blocks | Bills |
|---|---|---|---|
gpu --json setup | get a working endpoint: rent, or restart a stopped machine, and wait for the model | until ready | yes |
gpu --json env | read the endpoint without starting anything | no | no |
gpu --json status | full state, cost so far, the guard's decision | no | no |
gpu --json stop | stop now; disk and model cache kept | until stopped | ends GPU time |
gpu --json destroy --yes | delete it; nothing billed afterwards | until gone | ends all |
gpu --json lock --for 2h / unlock | keep it up through a quiet period, then return to the rules | no | while locked |
{
"instance_id": "27581234",
"state": "ready",
"endpoint": "http://203.0.113.7:41022",
"base_url": "http://203.0.113.7:41022/v1",
"api_key": "k6V0… (43 characters, per machine)",
"model": "Qwen/Qwen2.5-7B-Instruct",
"hourly_cost_usd": 0.196
}The key is per machine: it survives stops and restarts and changes only when a new machine is rented. Take base_url, api_key and model from the latest setup instead of caching them across restarts. gpu env without --json prints shell exports.
15Contract: exit codes
| Code | Meaning | What to do |
|---|---|---|
| 0 | success | |
| 1 | unexpected error | log stderr, retry later |
| 2 | config error, or config changed since setup | fix it; setup --recreate replaces a machine built from the old one |
| 3 | no instance, no endpoint | call setup |
| 4 | provider API error | retry with backoff |
| 5 | provider authentication failed | the user runs gpu login |
| 6 | no capacity matches | retry later, or relax VRAM or the budget |
| 7 | provisioning failed | retry; the failed machine was already destroyed |
| 8 | provider timed out | retry with backoff |
| 9 | the provider can't do this | change the config |
| 10 | over budget.max_hourly_cost_usd | raise the cap or wait for cheaper offers |
| 11 | the model server didn't start | stderr has its log tail; the machine was destroyed |
| 12 | another gpu command holds the project lock | wait and retry; status answers with "busy": true |
16Contract: MCP tools
Each tool runs the CLI with --json in the project directory, so errors carry the same exit_code, plus meaning and next for the agent.
| Tool | Does | Costs money |
|---|---|---|
gpu_init | write gpu.yaml for a model, with an optional price cap and VRAM | no |
gpu_validate | check config and credentials | no |
gpu_offers | cheapest matching machines and their price | no |
gpu_setup | rent or restart, wait for the model (background job, re-attachable) | yes |
gpu_status | state, cost so far, idle time, the watchdog's next move | no |
gpu_connection | base_url, api_key, model without starting anything | no |
gpu_run | run a local command with the endpoint in its environment | if it has to start the machine |
gpu_job_run · _status · _pull · _cancel | run code on the GPU and bring the outputs back | yes |
gpu_logs | runtime, onstart, watchdog or provider log | no |
gpu_lock / gpu_unlock | keep the machine up through a quiet period | while locked |
gpu_stop | stop now; restart takes about a minute | ends GPU time |
gpu_destroy | delete; needs confirm=true | ends all |
gpu_ls | every machine in the account, from any project | no |
17Contract: the watchdog API
HTTP on port 8777 of the machine. Every route except /health needs the header X-Jambu-Token, compared in constant time. The token lives in .gpu/state.json and is never printed. The CLI is the usual caller; you rarely need these directly.
| Route | Purpose |
|---|---|
GET /health | liveness, no auth |
GET /state | state, idle and session age, workloads, lock, last traffic probe, runtime_alive, and the decision it would take now |
GET /events?limit=N | the machine's event log |
GET /logs?name=runtime|onstart|watchdog&lines=N | log tails without SSH (default 200, at most 2000) |
POST /identify | the CLI tells the machine its instance id, hourly price and policy |
POST /starting · /ready | model startup began, model answers |
POST /activity | mark activity now |
POST /workload/start · /heartbeat · /end | register work, keep it alive, end it with a return code |
POST /lock · /unlock · /extend | locks with a TTL (indefinite only when the project allows it) |
POST /shutdown | {"action": "stop"|"destroy", "reason"}; remembered and retried if the provider call fails |
/jobs, /jobs/<id>/bundle|start|log|outputs|cancel | the jobs extension |
18Contract: provider adapters
Vast.ai ships built in. Any other provider is one Python class that implements providers/base.py. The core, the watchdog, the CLI and the MCP tools stay the same.
$ gpu providers new runpod --display-name "RunPod" # writes gpu_providers/runpod.py $ gpu init --provider runpod --model Qwen/Qwen2.5-0.5B-Instruct $ gpu login --provider runpod $ gpu --json validate && gpu --json offers # real GPUs, real prices, nothing rented
| Part | Must do |
|---|---|
capabilities | declare only what the API supports; stop_eliminates_billing=False if a stopped machine still bills |
tagline, signup_url, setup_steps | what gpu login shows a first-time user: one line about the provider and the steps from no account to a key, in plain words |
verify_credentials | check the key; return only safe fields such as a balance, never an email, a name or the key |
find_offers | GPUs that fit VRAM, count, disk and the price cap, cheapest first |
setup | rent with the image, env, jambu- label, ports and onstart script |
status | map states onto provisioning … destroyed, ports onto model and watchdog |
stop, destroy | succeed when already stopped or gone |
list_instances | only machines labeled jambu-; never anything else in the account |
WATCHDOG_ACTIONS | stdlib-only provider_stop(ctx) and provider_destroy(ctx) that run on the machine |
An adapter can live in the project (provider.plugin: ./gpu_providers/acme.py:AcmeProvider), in an installed package (entry point group gpu4agents.providers), or in this repository. Errors are the normalized ones from core/errors.py, so exit codes are the same on every provider.
19Configuration
gpu.yaml is the desired state. gpu reads only its gpu_runtime: key. Unknown keys are a hard error, so a typo in idle_timeout can't silently switch off the protection.
gpu_runtime: version: 1 model: {id: stabilityai/sd-turbo} compute: gpu: {min_vram_gb: 12} budget: max_hourly_cost_usd: 1.00 max_session_cost_usd: 5.00 lifecycle: idle_timeout: 15m max_lifetime: 6h stopped_ttl: 24h
| Field | Default |
|---|---|
lifecycle.idle_timeout | 15m |
lifecycle.max_lifetime | 6h |
lifecycle.stopped_ttl | 24h |
lifecycle.heartbeat_grace | 5m |
lifecycle.watchdog.interval | 60s |
lifecycle.traffic_counts_as_activity | true |
health.boot_timeout | 30m |
health.pull_stall_timeout | 10m |
compute.host_attempts | 3 |
budget.* | unset |
At least one of idle_timeout and max_lifetime must be set, and idle_timeout may not exceed max_lifetime. Override the price cap once with gpu setup --allow-cost-override. Every field: CONFIG.md.
20Security
- The model endpoint needs a key. Unless
runtime.api_keyis set, setup generates one per machine (43 random URL-safe characters)./healthand/metricsstay open; they reveal no data. - The endpoint is plain HTTP on a public IP and port, so the key and prompts travel unencrypted. For sensitive data, use a private network or a tunnel, or put a TLS proxy in front.
- The watchdog holds a provider key on the machine (
/etc/jambu/watchdog.json, mode 600) so it can stop itself. Use a dedicated, restricted key. Opting out (lifecycle.watchdog.enabled: false) leaves shutdown togpu guard, andvalidatewarns. - The key never goes through the chat.
gpu logintakes it in a hidden prompt in your terminal, and the skill tells the agent never to ask for it, read it or print it. - A shell alias can shadow
gpu. With Oh My Zsh'sgpu = git push upstream, an agent typinggpu setupin a repository would push. The installer removes the alias for new shells, and the skill has the agent checktype gpufirst and usecommand gpu. MCP tools don't go through a shell. - Account hygiene.
gpu lsandgpu sweeponly see machines labeledjambu-.
21Full reference
The pages agents read are served from this site as Markdown. The long-form references live in the repository.
install.md
install, connect the account, learn the rules
serving.md
serve any model behind OpenAI routes
jobs.md
run your own code on the GPU
providers.md
write an adapter for another provider
INTEGRATION.md
the application contract in full
LIFECYCLE.md
how shutdown works, in detail
CONFIG.md
every gpu.yaml field
USAGE.md
every command, the sweep, timers
ACCEPTANCE.md
the guarantees and the tests that hold them