Nasute
A self-hosted eval harness for RAG (retrieval-augmented generation: a system that looks things up and then writes an answer) and for language models. It asks a system questions with known answers, has a second AI mark the answers claim by claim, counts, and keeps every run. It tells you whether a change made things better, worse or no different, with a 95% range on every number. Named after the nasute, the soldier termite that guards the colony.
Plain Python 3.11 or newer, standard library only. Any system you can ask a question over HTTP is a target, and anything else takes one Python function.
The demo report on a phone: the front page, and a run page with its outcomes at a glance.
Quick start
Install. Nasute uses only Python's standard library, so pipx is the way to install it; there is no Docker image, and none is needed.
pipx install nasute # or, until it is on PyPI: pipx install git+https://github.com/bobbyely/nasute
Or run it from a clone, with no install. Then type python3 -m nasute wherever this page says nasute:
git clone https://github.com/bobbyely/nasute && cd nasute
export PYTHONPATH="$PWD/src" # lets python3 find the code from any folder
python3 -m nasute --help
Changing the code? Install it editable in a virtual environment instead (python3 -m venv .venv && .venv/bin/pip install -e .); see CONTRIBUTING.md.
Try the demo, with no account and no model. In one terminal start the stand-in system and judge, and in another make a folder set up for it and run:
nasute demo-server # leave it running
nasute init try --demo && cd try # in a second terminal
nasute run --profile smoke
Each question gets a line as it is marked, such as [2/3] water-boils ... right (0.0 s). The run ends with its scores, each with a 95% range, and a link to its page in the report.
Point it at your own model. Run nasute init mytest (without --demo) and edit [targets.mine] and [judge] in mytest/nasute.toml. Ready-made settings: a model behind an OpenAI-compatible API and a model run by Ollama. Then nasute run --profile smoke from that folder.
Open the report. Open report/index.html in a browser, or run nasute serve and visit http://127.0.0.1:8765/. The front page shows each dataset with its systems ranked; click through to a dataset and then to a run, or tick runs to compare them. To have the printed link use your own web address, set report_url (see settings).
Progress prints as short lines at a terminal and as JSON lines when the output goes to a file or a pipe, for a program that reads logs; --log text or --log json picks one (commands).
The full walk-through is the Quick start.
How do I…
- test my own endpoint or model?
- write questions, and change them safely? Or import them from a spreadsheet.
- tag questions? Tags group the scores in the report, by topic and by difficulty.
- compare two models, or two runs?
- mark a baseline, or label a run?
- see why a question failed?
- take the results into a spreadsheet?
- use a hosted model as the judge?
- check the judge marks fairly?
- run a long test overnight?
Documentation
All of it is in docs/: a Quick start, How Nasute works, how-to guides, a reference and explanations.
This repo
| Path | What |
|---|---|
src/nasute/__init__.py |
The tool: settings, datasets, statistics, judge, runs, compare, command line. |
src/nasute/manage.py, pages.py |
dataset and runs commands; the static report. |
src/nasute/demo_server.py |
nasute demo-server: a stand-in system and judge for the quick start. |
src/nasute/targets/ |
The built-in kind of target, http. Your own is a module:function in the settings. |
src/nasute/datasets/ |
demo: ten questions about a made-up garden handbook (demo/handbook.md). judge-demo: answers with known faults, to test the judge. |
src/nasute/assets/ |
The report page script and style, and three vendored libraries (MIT, each with its licence file): uPlot 1.6.32, Chart.js 4.5.1 and @sgratzl/chartjs-chart-boxplot 4.4.5. Versions and SHA-256 are in data layout. |
src/nasute/starter/ |
What nasute init copies out. |
nasute.example.toml |
Every setting, explained. |
examples/ |
Ready settings for a model behind an OpenAI-compatible API, and for one run locally by Ollama. |
tests/nasute_test.py |
Checks, with made-up data: python3 tests/nasute_test.py. No network, no model, no install. |
Contributing and security
See CONTRIBUTING.md. To report a security problem, see SECURITY.md.
Licence
MIT (see LICENSE). The vendored chart libraries keep their own MIT licences, in src/nasute/assets/.
Metadata
Release files for nasute 0.1.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 |
|---|---|---|---|---|
| nasute-0.1.0.tar.gz | 2.4 MB | With provenance | Details for nasute-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| nasute-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for nasute-0.1.0-py3-none-any.whl |
Total release size: 2.7 MB
Release files / nasute-0.1.0.tar.gz
| Download URL | nasute-0.1.0.tar.gz |
|---|---|
| Size | 2.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c52c60a65b8e61cad5432e4e13ee5f94318495289a072f15e3d377e7a5199ea5
|
|
BLAKE2b-256 checksum How to use checksums |
fc3507769c9e9688df03080fcfa968fc30f93634c30523b7f03cf9d05dcea0cd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 12, 2026.
Transparency logRelease files / nasute-0.1.0-py3-none-any.whl
| Download URL | nasute-0.1.0-py3-none-any.whl |
|---|---|
| Size | 223.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f7d79c18dc22cc76f82c545e6b52534a37734ea02d3b3bd0c2235f7ebb5d737c
|
|
BLAKE2b-256 checksum How to use checksums |
5395b0bf5954a0e8f973941ceb3a0c829e1b1ab8b48bea6a963d9748d477e703
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 12, 2026.
Transparency logSecurity for nasute 0.1.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.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for nasute-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 12, 2026.
Transparency logA 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.