Stoneburner
Local-first LLM evaluation: token cost, quality, and security suites. The same commands cover a laptop Ollama box and a cloud API.
Install stoneburner-atomics.
The CLI and the import stay atomics. (atomics on PyPI is a different
package; stoneburner is too similar to an existing stone-burner.)
This is a desk tool, not a research harness and not an unsupervised agent.
It records cost, quality, and security-suite results in SQLite. A
finished-looking percentage on a partial run is the failure mode it is
built to avoid: incomplete coverage prints n/a (scored/total scored)
and JSON nulls the headline.
atomics doctor ends with one Next: command when the check is healthy.
Typical first-run output (Ollama on localhost, no cloud key):
$ atomics doctor
Python 3.13.11 OK
Platform: Darwin (arm64)
Database path: data/atomics.db
SQLite database OK (readable / creatable)
ANTHROPIC_API_KEY not set (optional; needed for Claude)
OPENAI_API_KEY not set (optional; needed for OpenAI)
inference.env: not found (optional; $INFERENCE_ENV or /etc/agentic/inference.env)
Ollama endpoint: http://localhost:11434
Ollama reachable — 3 model(s): qwen2.5:7b, gemma3:4b, llama3.2:3b
Next: atomics provider-test --provider ollama --no-thinking
Ollama is reachable.
$ atomics toolcall --provider ollama --channel tools --runs 3 --no-thinking
Summary
tool-capable: yes
outcomes: safe call=6 no call=14
channel divergence (resisted in prose, complied with tools): not measured (no qualifying fixtures)
response divergence (dangerous call, refusing text): not measured (no qualifying fixtures)
cost: $0.0000
A tools-only first run is valid. Channel divergence needs a second model
as judge. Thinking models that spend the token budget on hidden reasoning
are recorded as thinking_budget, not as a mystery generation failure.
New here? QUICKSTART — copy-pasteable commands grouped by goal.
Contributing? ARCHITECTURE — layer map, primitives, how to add an eval suite.
Table of Contents
- Install
- Providers
- Burn Tiers
- Key Commands
- Security Suites
- Load Testing
- Thinking Mode
- Configuration
- Secrets Management
- Architecture
- Running Tests
- Further Reading
Install
Ollama on http://localhost:11434 is the one-box path. No cloud key required.
uv tool install stoneburner-atomics
atomics doctor
atomics provider-test --provider ollama --no-thinking
atomics toolcall --provider ollama --channel tools --runs 3 --no-thinking
--no-thinking keeps reasoning models from spending the whole token budget
on hidden chain-of-thought. A tools-only toolcall run is a valid first
run; channel divergence needs a second model as judge.
API, MCP, or RAG extras:
uv tool install 'stoneburner-atomics[api,mcp]'
uv add 'stoneburner-atomics[rag]' # from another project
From a clone, uv sync --all-extras. Bare uv sync drops the API, MCP,
RAG, and test extras.
Cloud providers work the same way once a key is set:
export ANTHROPIC_API_KEY=sk-ant-...
atomics provider-test
atomics run -n 5
atomics report
atomics run --provider openai -n 5
atomics run --provider bedrock --region us-east-1 -n 5
Providers
| Provider | Flag | Install |
|---|---|---|
| Claude (Anthropic) | --provider claude (default) |
uv sync |
| Bedrock (AWS) | --provider bedrock --region us-east-1 |
uv sync --extra bedrock |
| OpenAI / Codex | --provider openai |
uv sync --extra openai |
| Ollama (local) | --provider ollama |
uv sync (uses httpx) |
| brain-gateway | --provider brain-gateway |
uv sync (uses httpx) |
| Groq (cloud) | --provider groq |
uv sync (uses httpx) |
| Together AI (cloud) | --provider together |
uv sync (uses httpx) |
| Google Gemini | --provider gemini |
uv sync (uses httpx) |
| llama.cpp (local) | --provider llamacpp |
uv sync (uses httpx) |
| vLLM (OpenAI-compat) | --provider vllm |
uv sync (uses httpx) |
Compare providers after running benchmarks: atomics compare — see
COMPARING
for model classes, metrics fidelity, and judge accuracy.
Optional extras: from PyPI,
uv add 'stoneburner-atomics[rag]'(or[bedrock],[openai],[api],[mcp]). From a clone,uv sync --all-extras. RAG isatomics rag-index/rag-retrieval/rag --index.atomics server --with-dashboardserves the read-only UI at/dashboard.atomics mcpproxies a running API server and inherits that server's authentication and spend ceilings. See MCP_SERVER.
Burn Tiers
| Tier | Tasks | Model | Interval | Budget | Tokens/hr |
|---|---|---|---|---|---|
| ez | Light only | Haiku 4.5 | 300s | $5 | 15k |
| baseline | Light + Moderate | Sonnet 4.6 | 120s | $50 | 100k |
| mega | All (incl. Heavy) | Sonnet 4.6 | 30s | $250 | 500k |
uv run atomics run --tier ez -n 3 -i 5
uv run atomics tiers # show all tier profiles
Key Commands
| Command | Description |
|---|---|
atomics run |
Start benchmarking loop |
atomics compare |
Provider/model side-by-side comparison |
atomics report |
Usage reports and trends |
atomics eval |
Quality evaluation suite |
atomics adversarial |
Adversarial resilience eval (72 fixtures) |
atomics toolcall |
Tool-call divergence: refuses in prose, complies via function call (20 fixtures) |
atomics redblue |
Red/blue security capability eval (10 fixtures) |
atomics refusal |
Over- vs under-refusal calibration (12 fixtures) |
atomics codereview |
Planted-vuln detection in snippets and diffs (8 fixtures) |
atomics judge-agreement |
Same generation, N judges; pairwise agreement and majority-flip rate |
atomics labcompare |
Two-host throughput + quality bench-off |
atomics stress |
GPU saturation testing |
atomics soak |
Long-duration stability test |
atomics rag |
RAG pipeline evaluation (grounding, faithfulness, abstention) — also supports real retrieval from an indexed corpus |
atomics rag-index |
Build a sqlite-vec index from local documents for real RAG retrieval |
atomics rag-retrieval |
Measure retrieval quality (recall@k, precision@k, MRR, nDCG@k) from an index |
atomics multiturn |
Multi-turn conversation eval (context retention, coherence) |
atomics advisor |
Cost optimization recommendations from historical data |
atomics codegen |
Code generation eval (functional correctness via test execution) |
atomics sweep |
Overnight multi-suite driver (--suites, --runs 3, status file + detachable log) |
atomics doctor |
Installation health check |
atomics server |
Run atomics as an HTTP API server |
atomics mcp |
Expose atomics to LLM agents over MCP (proxies the API server) |
Full reference: CLI_REFERENCE
Security Suites
Six eval suites for LLM security assessment:
| Suite | What it measures | Fixtures |
|---|---|---|
| adversarial | Resistance to manipulation (prompt injection, jailbreaks, MCP attacks) | 72 |
| toolcall | Whether a prose refusal survives contact with a function call | 20 |
| redblue | Offensive/defensive security capability (OSINT, vuln analysis, IR) | 10 |
| refusal | Over-refusal vs under-refusal calibration | 12 |
| codereview | Vulnerability detection in code snippets and diffs | 8 |
| archreview | Security architecture reasoning against whole repos | per-repo |
Plus probe (live infrastructure analysis) and sweep (multi-model ranked comparison).
Full documentation: SECURITY_SUITES · Leaderboards: adversarial · red/blue
Load Testing
| Command | Purpose |
|---|---|
atomics stress |
Ramp concurrency to find GPU saturation point |
atomics soak |
Long-duration stability with drift analysis |
atomics scenario |
Mixed-workload simulation with SLA scoring |
atomics capacity |
User load projection from stress data |
atomics labcompare |
Two-host throughput + quality bench-off |
Full documentation: LOAD_TESTING
Thinking Mode
Auto-detects reasoning-capable models (Claude extended thinking, OpenAI o-series, Ollama qwen3) and tracks thinking tokens separately.
uv run atomics run --provider ollama -m qwen3:14b -n 5 # auto-detected
uv run atomics run --provider claude --thinking -n 5 # explicit
uv run atomics run --provider openai -m o3 --no-thinking # forced off for A/B
Full documentation: THINKING
Configuration
Set via environment variables (prefix ATOMICS_) or .env file:
| Variable | Default | Description |
|---|---|---|
ANTHROPIC_API_KEY |
— | Claude provider |
OPENAI_API_KEY |
— | OpenAI provider |
ATOMICS_DEFAULT_MODEL |
claude-sonnet-4-6 |
Default model |
ATOMICS_OLLAMA_HOST |
http://localhost:11434 |
Ollama endpoint |
ATOMICS_OLLAMA_MODEL |
qwen2.5:7b |
Default Ollama model |
ATOMICS_OLLAMA_TIMEOUT |
300 |
Per-request timeout (s) |
ATOMICS_DB_PATH |
(platform) | SQLite location |
ATOMICS_BUDGET_LIMIT_USD |
50.00 |
Cost cap per run |
Database defaults: macOS: data/atomics.db · Linux: ~/.local/share/atomics/atomics.db (XDG)
CLI flags (--tier, --budget, --interval) override these at runtime.
Secrets Management
Layered resolution: environment variable → .env file → OS keychain (macOS Keychain / Linux secret-service).
atomics secrets set ANTHROPIC_API_KEY # store securely (hidden input)
atomics secrets list # verify
atomics secrets delete ANTHROPIC_API_KEY
Architecture
stoneburner/
├── atomics/ # Core Python package
│ ├── api/ # HTTP API server (FastAPI) — runs, evals, reports, jobs, dashboard
│ ├── commands/ # Click command modules (auth, admin, benchmark, eval, security, load, api, worker, distributed)
│ ├── distributed/ # Coordinator + worker for split and fleet runs
│ │ ├── coordinator.py
│ │ ├── models.py
│ │ ├── worker_client.py
│ │ ├── worker_runner.py
│ │ ├── routes.py
│ │ ├── rollup.py # Per-worker aggregation of fleet results
│ │ └── auth.py
│ ├── core/ # Loop engine, task runner, rate/budget guard
│ ├── eval/ # Evaluation framework (eval, adversarial, redblue)
│ ├── probe/ # Live ecosystem probe suite
│ ├── archreview/ # Security-architecture repo benchmark
│ ├── providers/ # LLM adapters (Claude, Bedrock, OpenAI, Ollama, vLLM, brain-gateway)
│ ├── storage/ # SQLite metrics persistence (schema v20)
│ ├── scheduler/ # Cron/systemd/launchd generation and installation
│ └── cli.py # Thin Click root — registers commands from commands/
├── profiles/ # Custom target profiles (local/ gitignored)
├── qa/ # QA fixture suites (local/ gitignored)
├── tests/ # 2500+ tests
└── docs/ # Detailed documentation
See ARCHITECTURE for the full layer map and contributor guide.
Running Tests
The api extra is required to run the suite: the API and distributed test
modules import FastAPI at module scope, so without it pytest errors during
collection instead of skipping. The mcp extra is not required for collection
— those tests skip if the SDK is missing — but CI installs it so the MCP
surface is actually tested. Sync it locally too.
uv sync --all-extras
uv run pytest -q
uv run pytest -q --cov=atomics --cov-report=term-missing --cov-fail-under=85
The suite drives FastAPI's TestClient, an in-process shim, so it proves the
logic but not that the pieces work as separate processes. For that:
uv run python scripts/smoke_fleet.py
This starts a real coordinator and real worker processes, runs a two-host fleet
job against a stubbed OpenAI-compatible endpoint, then kills a worker mid-run to
confirm the job resolves to partial instead of waiting on a dead host. It needs
no credentials and no model, and touches no real database.
Further Reading
Links are absolute so they work on PyPI as well as GitHub.
| Document | Description |
|---|---|
| QUICKSTART | Recipe-first guide grouped by goal |
| CONTRIBUTING | Setup, the checks CI runs, and project conventions |
| ARCHITECTURE | Layer map, primitives, contributor guide |
| SECURITY | Vulnerability reporting and operational security considerations |
| CHANGELOG | Version history |
| RELEASING | Release process, versioning and tag conventions |
| ROADMAP | Priorities and future directions |
| CLI_REFERENCE | Full CLI command reference |
| API_SERVER | HTTP API server, authentication, distributed runs, dashboard |
| MCP_SERVER | MCP server for LLM agents, tool surface, trust model |
| SECURITY_SUITES | Security evaluation suites |
| ADVERSARIAL_SUITES | Adversarial fixture flow, scoring, and categories |
| LOAD_TESTING | Stress, soak, scenario, capacity testing |
| COMPARING | Provider comparison, model classes, judge accuracy |
| THINKING | Thinking/reasoning mode internals |
| LEADERBOARD | Adversarial resistance leaderboard |
| LEADERBOARD-REDBLUE | Red/blue capability leaderboard |
| FRONTIER_COMPARISON | Local vs frontier model comparison |
| INFERENCE_ENV | Vendor-neutral inference control file spec |
License
MIT — see LICENSE.
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 stoneburner_atomics-0.18.2.tar.gz.
File metadata
- Download URL: stoneburner_atomics-0.18.2.tar.gz
- Upload date:
- Size: 1.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9b49688e4382b6f991d520bf29e83f6a5d773412be974600e8d64751694a9a2
|
|
| MD5 |
092cda6007be6da578f89e946d0b90fa
|
|
| BLAKE2b-256 |
cff082ea1a43de443bbd75ff1edf767835e6807a6cc3db15a81d4b3577226c88
|
File details
Details for the file stoneburner_atomics-0.18.2-py3-none-any.whl.
File metadata
- Download URL: stoneburner_atomics-0.18.2-py3-none-any.whl
- Upload date:
- Size: 483.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f2b46192dac501bcb71f295b01a2b10acc19d689fffc650f3746bfd94d01aeb
|
|
| MD5 |
59fa1057bb3cff4325832f1551fe9f78
|
|
| BLAKE2b-256 |
0403c73a8831a3e9a1a859f16ca2cd983a61b8775b78a7e3541f55d50bafb56e
|