The local-first AI engineering platform: trace, evaluate, test, and gate your LLM and voice agents on your own machine. Everything you use a hosted platform for, free and MIT at any scale, byte-reproducible, and CI-native. Nothing leaves your machine.
Project description
hotato
The local-first AI engineering platform.
Everything you reach for a hosted platform to do: trace, evaluate, test, and gate your LLM and voice agents, on your own machine. Free at any scale. Byte-reproducible. Nothing leaves it.
Hosted observability and eval platforms meter your traffic, keep your traces and prompts on their servers, and score your evals with a model, so the number drifts and cannot gate a build. hotato runs the same four jobs (tracing, evals, tests, and CI gates) on your own machine: free and MIT at any scale, byte-for-byte reproducible, and offline by default.
Catch your first failure in seconds. One command, no account:
$ uvx hotato start --demo
Conversation failed: Agent did not yield; measured talk-over was 2.66 s.
talk-over 2.66s the agent kept talking while the caller held the floor
Your text eval read the words on that call and passed it. The timing failed. hotato scores what the transcript can't see, pins the catch as a CI contract, and reproduces the verdict byte for byte on every machine. It measures timing and say-do, not intent.
What it does
Four planes, one install, nothing leaves your machine.
| Observe | traces, tokens, cost, and latency, from the OTel spans you already emit | hotato observe report traces/ |
| Evaluate | deterministic assertions plus a separated local-judge lane, no blended score | hotato assert run |
| Test | simulate calls, stress-test turn-taking, pin any failure as a fixture | hotato gauntlet |
| Gate | content-addressed contracts fail the build on a regression, in CI | hotato contract verify |
Deterministic. Byte-reproducible. Free, MIT. Agent-native over MCP.
Every verdict carries its evidence, scored across five dimensions: outcome, policy, conversation, speech, and reliability.
Why it is different
Same four jobs a hosted platform runs. Three things it cannot offer.
| hotato | Hosted platforms | |
|---|---|---|
| Trace, evaluate, test, gate | yes | yes |
| Price at scale | free, MIT, any volume | metered per seat and per event |
| Verdicts | byte-for-byte reproducible, gate a build | vary run to run |
| Your traces and prompts | stay on your machine | live on their servers |
| Runs in CI, offline | yes | needs their service |
From a bad call to a CI gate
One recording in. The pinned failure becomes a gate that stays red until the agent stops failing that call:
$ hotato investigate ./call.wav
most likely failure: [1] the agent talked over the caller for 2.66s
next: hotato investigate label '.hotato/investigate-state.json#1' --expect yield
$ hotato investigate label '.hotato/investigate-state.json#1' --expect yield
created hotato contract: call-8s-yield
$ hotato contract verify contracts/
[FAIL] call-8s-yield 0/1 contracts pass; exit_code=1
A contract re-measures the captured failure under the pinned policy on every CI run, the same discipline a snapshot test gives you. Same input, same verdict, byte for byte, on every machine.
Quickstart
# 1. catch a failure on two bundled calls (no account; exits 0)
uvx hotato start --demo
# 2. score your own recording (or a transcript: --transcript t.json)
hotato investigate ./call.wav
# 3. pin the caught moment as a regression contract
hotato investigate label '.hotato/investigate-state.json#1' --expect yield
# 4. gate every pull request on it
hotato contract verify contracts/
Keep it with pipx install hotato, drive it over MCP with uvx --from "hotato[mcp]" hotato-mcp, or walk the path in docs/GETTING-STARTED.md.
Wire it into CI
The step's exit code is the verdict: 0 pass, 1 fail, 2 refuse.
# .github/workflows/voice-qa.yml
on: [pull_request]
jobs:
hotato:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: attenlabs/hotato@v1.14.0
with:
contracts: contracts/
hotato-version: 1.14.0
Copy-paste workflow with a commit-SHA pin: docs/CI.md.
Feed it what you already have
Every onramp feeds the same offline scoring and the same 0 / 1 / 2 exit contract.
hotato pull --stack vapi --limit 10 # your stack's recorded calls
hotato trace ingest --otel traces.jsonl # the OTel spans you already log
hotato simulate demo.scenario.json --out ./sim # scripted fixtures, no production audio
Details: docs/CONNECT.md · docs/TRACE.md · docs/SIMULATE.md
Point your agent at it
Point Claude Code, Cursor, or any coding agent at this repo: it reads AGENTS.md and runs the loop end to end, offline, no key. The MCP server exposes the scorer plus read/verify/propose tools over local stdio (docs/MCP.md).
Nothing leaves your machine
hotato runs offline, on the machine that invokes it. The core is stdlib-only Python: no account, no key, no network call of its own. Your traces, prompts, and audio stay local, and the local-judge lane is opt-in and quality-gated, separate from the deterministic core.
Specifications
| Property | Value |
|---|---|
| Footprint | ~10 MiB installed, 0 runtime dependencies (stdlib-only) |
| Reproducibility | byte-for-byte, content-addressed contract |
| Exit contract | 0 pass · 1 fail · 2 refuse |
| Release integrity | OIDC Trusted Publishing + build-provenance attested |
| Runtime | offline, off the production data path |
Verify the measurement yourself
PYTHONPATH=src python3 -m hotato.benchmark \
--scenarios corpus/real/scenarios --audio corpus/real/audio
On 13 recorded AMI Meeting Corpus clips, the median error between measured caller-onset and the human word-alignment label is 20 ms. Provenance: corpus/real/README.md · method: METHODOLOGY.md.
Timing is measurable only when the two voices arrive on separate channels; a mono or mixed export is marked NOT SCORABLE and refused (hotato trust --stereo call.wav).
Contribute
Issues and PRs welcome: CONTRIBUTING.md · SECURITY.md · CHANGELOG · docs/
License
MIT (LICENSE)
mcp-name: io.github.attenlabs/hotato
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hotato-1.14.0.tar.gz.
File metadata
- Download URL: hotato-1.14.0.tar.gz
- Upload date:
- Size: 12.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
743178f0467f8aeef1e3aa71b0024cfc596717b238809f1cbb12bb7370942289
|
|
| MD5 |
ab9083528b3fdef1601bd43141586289
|
|
| BLAKE2b-256 |
7d988c82bdca9835f4220f7736510b096456e8f303b212564a1cad0e155f91ba
|
Provenance
The following attestation bundles were made for hotato-1.14.0.tar.gz:
Publisher:
publish-pypi-oidc.yml on attenlabs/hotato
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hotato-1.14.0.tar.gz -
Subject digest:
743178f0467f8aeef1e3aa71b0024cfc596717b238809f1cbb12bb7370942289 - Sigstore transparency entry: 2217885928
- Sigstore integration time:
-
Permalink:
attenlabs/hotato@5b5b03dd08c665d2895cef504da39144f2257a30 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/attenlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi-oidc.yml@5b5b03dd08c665d2895cef504da39144f2257a30 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file hotato-1.14.0-py3-none-any.whl.
File metadata
- Download URL: hotato-1.14.0-py3-none-any.whl
- Upload date:
- Size: 6.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
197e3a171c195763d03968925c05926f21421a190f39bb81071bd15e9fb61d2a
|
|
| MD5 |
7f3331fec3d1423b296408f2c20f0772
|
|
| BLAKE2b-256 |
8b46cecd3aa248b2e6dbffc806c48b27e95ca890812d15f6ec5ee97f6de50f07
|
Provenance
The following attestation bundles were made for hotato-1.14.0-py3-none-any.whl:
Publisher:
publish-pypi-oidc.yml on attenlabs/hotato
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hotato-1.14.0-py3-none-any.whl -
Subject digest:
197e3a171c195763d03968925c05926f21421a190f39bb81071bd15e9fb61d2a - Sigstore transparency entry: 2217886214
- Sigstore integration time:
-
Permalink:
attenlabs/hotato@5b5b03dd08c665d2895cef504da39144f2257a30 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/attenlabs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi-oidc.yml@5b5b03dd08c665d2895cef504da39144f2257a30 -
Trigger Event:
workflow_dispatch
-
Statement type: