Install

One binary. Four ways to get it.

Release 0.11.2, from airmet.ai. The pip wheel, the npm package and the bare download carry the same static binary for your platform, byte for byte, and the Docker image (linux/amd64) carries the Linux x86_64 one — airmet version tells you which. Pick the channel that matches how you deploy; the rest of this page is the same on every one.

v0.11.2 · one release on every channel
$ pip install --index-url https://airmet.ai/simple/ airmet
$ airmet up --config hedger.yaml

pip reads our own package index at https://airmet.ai/simple/ (index-url, never extra-index-url: the wheel has no dependencies, and a second index would let a same-named package elsewhere win). With pipx, run pipx upgrade-shared, then pipx install --index-url https://airmet.ai/simple/ airmet: from pipx 1.6 on, pipx's first install also fetches pipx's own pip, from the index it names, and ours carries only airmet (an older pipx needs only the second command). The wheel is the binary plus a 70-line shim and the wrap() helper; Python ≥ 3.9 only to run them.

Run pip inside a virtual environment (python3 -m venv .venv, then activate it): on a stock Mac and on a Python that refuses system-wide installs, the command as typed fails outside one.

Using a coding agent? Give it this page

https://airmet.ai/install-for-agents.md is the install as a runbook for Claude Code, Cursor, Codex or any agent that can run a shell: what to ask you first, the commands with checksum checks, the expected output of every step, and a checklist it reports back. Your keys stay in your environment: it never asks you to paste one. The same runbook as a docs page. Paste this into your agent:

Install airmet for this project by following https://airmet.ai/install-for-agents.md — ask me every question it lists before you act, and report back with its Done-when checklist.

1 · Two legs in hedger.yaml

Twinlegging needs two legs that can fail independently: two pinned providers on one marketplace key, two provider keys, or the same provider twice. The three shapes of the file are on the Start-here block; keys are named by environment variable and never appear in the file or in argv.

Twinleg does not cancel the slower leg when the winner arrives (only the runaway guard stops one that loops or runs far past the winner), so it races without an abort-billing verdict: every raced request bills both legs. A policy that does cancel it (deferred-p95, immediate) fires only on legs whose verdict is a measured refund. Under one, legs given by URL alone (--providers) carry no route to match a verdict against and are served unhedged until you give them a route in the file or pass --on-no-refund allow, the loud override for a pilot. The boot log names the posture per leg.

2 · Start the sidecar

airmet up --config hedger.yaml

From here on, airmet is the command your channel installed: airmet after pip or pipx, npx airmet after npm, ./airmet-<platform> for the bare download (or move it onto your PATH as airmet), and docker exec <container> /airmet in Docker.

The binary checks every HTTPS connection (your providers, telemetry, the login) against the operating system's CA certificates. A slim container image can ship none (node:*-slim, a bare debian or ubuntu): install them first, with apt-get update && apt-get install -y ca-certificates (a fresh image has no package lists yet), or every leg fails its health check. The Docker image carries its own.

The first run prints a one-time notice: telemetry is on by default, and you can opt out anytime with --no-telemetry: it takes effect at once and is saved in the config file, so it holds for every later run that reads that file. In Docker the file lives under /data: mount a volume there, or each new container starts as a first install — the notice again, a new install id, telemetry on unless that run is given --no-telemetry too. It sends one record per request — timings and sizes, the outcome (HTTP status and error class), each leg's route (provider, model, region), token counts and cost, the decision taken, a session link, and labels as you configured them: pool, scenario, your legs' ids as you named them in hedger.yaml — plus a random install id created on this machine at first run (am_…). Each push also carries the sidecar's version, your policy settings and each leg's route, its request counters, the state of its priors feed and any cost-guard trip. Never prompts, completions, keys, error bodies or URLs. AIRMET_TELEMETRY_SCHEMA=v1 sends aggregate windows instead. Opting out stops the pushes and changes nothing about racing; the id stays in the config file. airmet status shows the serving address (:8080/v1), the legs, the verdict gate and the priors in use; airmet health is the readiness probe.

3 · Change one base URL

client = OpenAI(base_url="http://127.0.0.1:8080/v1")

The sidecar listens on 127.0.0.1:8080, so that is the address on the machine it runs on. An app on another host or in another container uses that host's name instead, and the sidecar is started with --host 0.0.0.0 and --auth-token-env, since it spends your keys (install channels). The sidecar is a local proxy, so your language is irrelevant — Node, Go, and Python clients all just change base_url; the Python wheel and the npm package also ship a wrap() helper that starts a sidecar when you wrap your client and points the client at it. From 0.11.1 that sidecar lives as long as your app. On 0.11.0 it exits after 10 minutes without a request, and a client wrapped before then is refused on its next request: in a long-running app on 0.11.0, read the install channels note first. Quickstarts per stack are in the docs.

Optional · Link this machine

airmet login

A device flow: the terminal prints a short code and a link; approve it in any browser and the machine is linked to your org. Linking is identity, not consent: it turns on the live route feed (fleet-tuned routing priors, signed and verified against keys pinned in the build) and the fleet panel, whatever your telemetry choice — whenever a linked install registers or polls the feed, it sends its token and its install id, even with telemetry off, and the route feed is also sent the public catalog routes its legs use. An unlinked install runs on its built-in defaults plus the abort-billing verdicts baked into the binary.

Know what leaves the box

Everything airmet sends off your machine — and how to check its telemetry pushes byte for byte in your own Wireshark — is in traffic transparency; airmet traffic prints the same inventory locally.

No analytics until you say so. One first-party cookie remembers this choice; allowing adds EU-hosted usage analytics and error reporting (what we send); declining changes nothing about how the site works.