asiai-inference-server
Fleet manager for local LLM inference engines on Apple Silicon.
Status: v0.3.0 — released on PyPI. Lifecycle, memory reclaim, presets, upgrades, fleet push and health probing are functional. See the roadmap below for what each version shipped.
asiai-inference-server is the control plane companion to
asiai (the observability/benchmark CLI). Where asiai
observes what's running on your Mac, this project manages it: install,
start, stop, unload, and orchestrate inference engines (llama.cpp,
Ollama, LM Studio, oMLX, TurboQuant, mlx-lm, vMLX, Rapid-MLX, MTPLX, …)
across one or several Apple Silicon machines.
It also fixes the long-standing macOS pain point: engine memory that never
gets freed because of the unified-memory compressor. Killing a process
doesn't release the VRAM. This tool combines per-engine unload APIs, full
LaunchDaemon restart, and sudo purge to reclaim memory deterministically —
and reports the actual delta measured, not a marketing promise.
Why
After a year of running multi-engine LLM inference on Apple Silicon (MacBook M1 Max, Mac Mini M4 Pro, MacBook M5 Max), the operational gap became obvious:
- Install/uninstall an engine should not require chasing brews, plists and firewall rules across READMEs.
- Switching profiles ("coding agent on Qwen-Coder 32B" → "70B chat on TurboQuant") should be a single command, not five.
- Memory unload should actually free the VRAM, not let the macOS compressor sit on it.
- A fleet of Macs should be a single dashboard, not three SSH sessions.
- AI agents (Claude Code, Cursor, Windsurf) should be able to manage the fleet via MCP, not just observe it.
asiai-inference-server ships these one at a time, building on the
asiai observability stack.
Roadmap
| Version | Scope | Status |
|---|---|---|
| v0.1 | Install/uninstall/start/stop/restart + unload + purge memory, pf firewall anchor, sudoers bootstrap | shipped |
| v0.2 | aisctl upgrade (brew, whitelisted), asiai versions provider, fleet Phase 2 (loopback serve + orchestrator fleet push) |
shipped |
| v0.3 | status --deep (generation probe, catches GPU-OOM zombies), install records + reinstall, single preset location, disable/enable (cold standby) |
shipped |
| v0.4 | asiai-priv privileged helper — a root-owned, content-validating helper replaces the wildcard sudoers: generate-don't-validate plists, a closed action allowlist, forced non-root run-as, and an append-only audit log; NOPASSWD is reduced to the helper alone |
shipped |
| v0.5 | SMAppService app bundle + asiai-launch (named entry with custom icon in Background Items) |
in review |
| later | Profile switching (apply/rollback), fleet inventory, web cockpit, MCP write tools | planned |
Architecture (high level)
- CLI:
aisctl <command>(standalone) orasiai engine <command>(auto-injected sub-CLI whenasiai-inference-serveris installed alongsideasiai). - Python stdlib only for the core (consistent with
asiai). The package depends onasiai>=1.15.0(auth.loopback+ the sharedfleet.command_spec). Optional extras:mcp(for future write tools). - macOS Apple Silicon only. We rely on
launchctl,vm_stat,sudo purge,pfctl,iogpu.wired_limit_mb. - HTTP agent for fleet operations (loopback
serve+fleet pushorchestrator, shipped v0.2). - TOML for human-edited files (engine manifests, profiles, fleet inventory). JSON for runtime state.
- Engine API keys stay out of plists and
ps: manifests declare[binary].api_key_file(path to an operator-created, mode-600 key file the engine reads at startup — e.g.llama-server --api-key-file) and[network].api_key_file(same file, used by the health/generation probes to authenticate). Only paths appear in manifests, generated plists, and process arguments — never key values.
License
Apache-2.0 © 2026 Jean-Marc Nahlovsky
Metadata
Release files for asiai-inference-server 0.17.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 | |
|---|---|---|---|
| asiai_inference_server-0.17.0.tar.gz | 431.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| asiai_inference_server-0.17.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 744.6 kB
Release files / asiai_inference_server-0.17.0.tar.gz
| Download URL | asiai_inference_server-0.17.0.tar.gz |
|---|---|
| Size | 431.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
790bdcfb7e869df9ef038077616cfa37d4008d3e7bcd40d83061ddf29fd21d17
|
|
BLAKE2b-256 checksum How to use checksums |
3daa51aa00ecf767a862471edfafd6d9582b699fd1323fa8de823d2f188ad947
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency logRelease files / asiai_inference_server-0.17.0-py3-none-any.whl
| Download URL | asiai_inference_server-0.17.0-py3-none-any.whl |
|---|---|
| Size | 312.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0097cc50325cfb83f12eb146e2e2d2d2f21c94f3c6cd45559c5087d80f0377f3
|
|
BLAKE2b-256 checksum How to use checksums |
9c730743ecf4ac1cdc3ac5796b719d40d521f4aa0d0c657d3dabcf0ef752178c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency log